هل سبق لك استخدام print()
أو log()
لتصحيح أخطاء التعليمات البرمجية الخاصة بك؟ بالطبع تفعل. IceCream، أو ic
للاختصار، يجعل تصحيح أخطاء الطباعة أكثر متعة قليلاً.
ic()
يشبه print()
ولكنه أفضل:
تم اختبار IceCream جيدًا، وتم ترخيصه بشكل مسموح به، ويدعم Python 3 وPyPy3.
يبحث IceCream عن مساهم رئيسي + مشرف. هل ترغب في قيادة IceCream وتحسين تصحيح الأخطاء للجميع في Python؟ يرجى التواصل واسمحوا لي أن أعرف! ؟
هل سبق لك أن قمت بطباعة متغيرات أو تعبيرات لتصحيح أخطاء برنامجك؟ إذا كنت قد كتبت شيئا من هذا القبيل
print ( foo ( '123' ))
أو أكثر شمولا
print ( "foo('123')" , foo ( '123' ))
ثم سوف يضع ic()
ابتسامة على وجهك. باستخدام الوسائط، يقوم ic()
بفحص نفسه وطباعة الوسائط الخاصة به وقيم تلك الوسائط.
from icecream import ic
def foo ( i ):
return i + 333
ic ( foo ( 123 ))
مطبوعات
ic| foo(123): 456
بصورة مماثلة،
d = { 'key' : { 1 : 'one' }}
ic ( d [ 'key' ][ 1 ])
class klass ():
attr = 'yep'
ic ( klass . attr )
مطبوعات
ic| d['key'][1]: 'one'
ic| klass.attr: 'yep'
ما عليك سوى إعطاء ic()
متغيرًا أو تعبيرًا وتكون بذلك قد انتهيت. سهل.
هل سبق لك استخدام print()
لتحديد أجزاء برنامجك التي سيتم تنفيذها وبأي ترتيب يتم تنفيذها؟ على سبيل المثال، إذا قمت بإضافة عبارات الطباعة لتصحيح التعليمات البرمجية مثل
def foo ():
print ( 0 )
first ()
if expression :
print ( 1 )
second ()
else :
print ( 2 )
third ()
ثم يساعد ic()
هنا أيضًا. بدون وسيطات، يقوم ic()
بفحص نفسه وطباعة اسم ملف الاتصال ورقم السطر والوظيفة الأصلية.
from icecream import ic
def foo ():
ic ()
first ()
if expression :
ic ()
second ()
else :
ic ()
third ()
مطبوعات
ic| example.py:4 in foo()
ic| example.py:11 in foo()
ما عليك سوى الاتصال ic()
وبذلك تكون قد انتهيت. بسيط.
تقوم ic()
بإرجاع وسيطتها (وسيطاتها)، لذلك يمكن بسهولة إدراج ic()
في التعليمات البرمجية الموجودة مسبقًا.
>>> a = 6
>>> def half ( i ):
>>> return i / 2
>>> b = half(ic(a))
ic| a: 6
>>> ic(b)
ic| b: 3
يشبه ic.format(*args)
ic()
ولكن يتم إرجاع الإخراج كسلسلة بدلاً من كتابته في stderr.
>>> from icecream import ic
>>> s = ' sup '
>>> out = ic.format(s)
>>> print (out)
ic| s: 'sup'
بالإضافة إلى ذلك، يمكن تعطيل مخرجات ic()
بالكامل، وإعادة تمكينها لاحقًا، باستخدام ic.disable()
و ic.enable()
على التوالي.
from icecream import ic
ic ( 1 )
ic . disable ()
ic ( 2 )
ic . enable ()
ic ( 3 )
مطبوعات
ic| 1: 1
ic| 3: 3
يستمر ic()
في إعادة وسائطه عند تعطيله بالطبع؛ لا يوجد كود موجود مع فواصل ic()
.
لجعل ic()
متاحًا في كل ملف دون الحاجة إلى استيراده في كل ملف، يمكنك install()
. على سبيل المثال، في الجذر A.py
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from icecream import install
install ()
from B import foo
foo ()
ثم في B.py
، الذي يتم استيراده بواسطة A.py
، ما عليك سوى الاتصال ic()
:
# -*- coding: utf-8 -*-
def foo ():
x = 3
ic ( x )
يضيف install()
ic()
إلى الوحدة النمطية المضمنة، والتي تتم مشاركتها بين جميع الملفات التي يستوردها المترجم. وبالمثل، يمكن لاحقًا إلغاء تثبيت ic()
uninstall()
) أيضًا.
يمكن أيضًا استيراد ic()
بطريقة تفشل بشكل جيد إذا لم يتم تثبيت IceCream، كما هو الحال في بيئات الإنتاج (أي ليس التطوير). ولتحقيق هذه الغاية، قد يكون مقتطف الاستيراد الاحتياطي هذا مفيدًا:
try :
from icecream import ic
except ImportError : # Graceful fallback if IceCream isn't installed.
ic = lambda * a : None if not a else ( a [ 0 ] if len ( a ) == 1 else a ) # noqa
يتحكم ic.configureOutput(prefix, outputFunction, argToStringFunction, includeContext, contextAbsPath)
في مخرجات ic()
.
prefix
، إذا تم توفيرها، تعتمد بادئة إخراج مخصصة. prefix
يمكن أن تكون سلسلة، مثل
>>> from icecream import ic
>>> ic.configureOutput( prefix = ' hello -> ' )
>>> ic( ' world ' )
hello -> 'world'
أو وظيفة.
>>> import time
>>> from icecream import ic
>>>
>>> def unixTimestamp ():
>>> return ' %i |> ' % int (time.time())
>>>
>>> ic.configureOutput( prefix = unixTimestamp)
>>> ic( ' world ' )
1519185860 |> 'world': 'world'
القيمة الافتراضية prefix
هي ic|
.
يتم استدعاء outputFunction
، إذا تم توفيره، مرة واحدة لكل استدعاء ic()
مع إخراج ic()
كسلسلة، بدلاً من كتابة تلك السلسلة إلى stderr (الافتراضي).
>>> import logging
>>> from icecream import ic
>>>
>>> def warn ( s ):
>>> logging.warning(s)
>>>
>>> ic.configureOutput( outputFunction = warn)
>>> ic( ' eep ' )
WARNING:root:ic| 'eep': 'eep'
يتم استدعاء argToStringFunction
، إذا تم توفيره، باستخدام قيم الوسيطات المطلوب إجراء تسلسل لها إلى سلاسل قابلة للعرض. الافتراضي هو pprint.pformat() الخاص بـ PrettyPrint، ولكن يمكن تغيير ذلك، على سبيل المثال، للتعامل مع أنواع البيانات غير القياسية بطريقة مخصصة.
>>> from icecream import ic
>>>
>>> def toString ( obj ):
>>> if isinstance (obj, str ):
>>> return ' [!string %r with length %i !] ' % (obj, len (obj))
>>> return repr (obj)
>>>
>>> ic.configureOutput( argToStringFunction = toString)
>>> ic( 7 , ' hello ' )
ic| 7: 7, 'hello': [!string 'hello' with length 5!]
الافتراضي argToStringFunction
هو icecream.argumentToString
، وله طرق register
unregister
الوظائف التي سيتم إرسالها لفئات معينة باستخدام functools.singledispatch
. كما أن لديها خاصية registry
لعرض الوظائف المسجلة.
>>> from icecream import ic, argumentToString
>>> import numpy as np
>>>
>>> # Register a function to summarize numpy array
>>> @ argumentToString.register(np.ndarray)
>>> def _ ( obj ):
>>> return f " ndarray, shape= { obj.shape } , dtype= { obj.dtype } "
>>>
>>> x = np.zeros(( 1 , 2 ))
>>> ic(x)
ic| x: ndarray, shape=(1, 2), dtype=float64
>>>
>>> # View registered functions
>>> argumentToString.registry
mappingproxy({object: <function icecream.icecream.argumentToString(obj)>,
numpy.ndarray: <function __main__._(obj)>})
>>>
>>> # Unregister a function and fallback to the default behavior
>>> argumentToString.unregister(np.ndarray)
>>> ic(x)
ic| x: array([[0., 0.]])
includeContext
، إذا تم توفيره وكان صحيحًا، فإنه يضيف اسم ملف استدعاء ic()
ورقم السطر والوظيفة الأصلية إلى مخرجات ic()
.
>>> from icecream import ic
>>> ic.configureOutput( includeContext = True )
>>>
>>> def foo ():
>>> i = 3
>>> ic(i)
>>> foo()
ic| example.py:12 in foo()- i: 3
includeContext
هو خطأ افتراضيًا.
contextAbsPath
، إذا تم توفيره وصحيح، فإنه يُخرج مسارات الملفات المطلقة، مثل /path/to/foo.py
، عبر أسماء الملفات فقط، مثل foo.py
، عندما يتم استدعاء ic()
باستخدام includeContext == True
. يعد هذا مفيدًا عند تصحيح أخطاء ملفات متعددة تشترك في نفس اسم (أسماء) الملفات. علاوة على ذلك، فإن بعض برامج التحرير، مثل VSCode، تحول مسارات الملفات المطلقة إلى روابط قابلة للنقر تفتح الملف الذي تم استدعاء ic()
فيه.
>>> from icecream import ic
>>> ic.configureOutput( includeContext = True , contextAbsPath = True )
>>>
>>> i = 3
>>>
>>> def foo ():
>>> ic(i)
>>> foo()
ic| /absolute/path/to/example.py:12 in foo()- i: 3
>>>
>>> ic.configureOutput( includeContext = True , contextAbsPath = False )
>>>
>>> def foo ():
>>> ic(i)
>>> foo()
ic| example.py:18 in foo()- i: 3
يكون contextAbsPath
خطأ افتراضيًا.
يعد تثبيت IceCream بالنقطة أمرًا سهلاً.
$ pip install icecream
يستخدم ic()
executing
بواسطة @alexmojaki لتحديد موقع مكالمات ic()
بشكل موثوق في مصدر Python. إنه سحر.
ينبغي الاستمتاع بالآيس كريم اللذيذ بكل اللغات.
إذا كنت تريد وظيفة ic()
مماثلة بلغتك المفضلة، فيرجى فتح طلب سحب! هدف IceCream هو تحسين تصحيح أخطاء الطباعة باستخدام وظيفة ic()
سهلة الاستخدام في كل لغة.