คุณเคยใช้ 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()
ed ในภายหลังได้เช่นกัน
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()
ทุกครั้งด้วยเอาต์พุตของ 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
หากระบุและ True จะเพิ่มชื่อไฟล์ของการเรียก 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
หากระบุและ True จะส่งเอาต์พุตพาธไฟล์สัมบูรณ์ เช่น /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 นั้นง่ายมาก
$ pip install icecream
ic()
ใช้ executing
โดย @alexmojaki เพื่อค้นหาการโทร ic()
ในแหล่ง Python ได้อย่างน่าเชื่อถือ มันเป็นเวทย์มนตร์
ไอศกรีมแสนอร่อยควรรับประทานในทุกภาษา
หากคุณต้องการฟังก์ชัน ic()
ที่คล้ายกันในภาษาที่คุณชื่นชอบ โปรดเปิดคำขอดึง! เป้าหมายของ IceCream คือการทำให้การดีบักงานพิมพ์ดีขึ้นด้วยฟังก์ชัน ic()
ที่มีประโยชน์ในทุกภาษา