Apakah Anda pernah menggunakan print()
atau log()
untuk men-debug kode Anda? Tentu saja. IceCream, atau disingkat ic
, membuat proses debug pencetakan menjadi lebih mudah.
ic()
seperti print()
, tetapi lebih baik:
IceCream telah diuji dengan baik, berlisensi permisif, dan mendukung Python 3 dan PyPy3.
IceCream sedang mencari kontributor utama + pengelola. Apakah Anda ingin memimpin IceCream dan meningkatkan proses debug untuk semua orang dengan Python? Silakan hubungi saya dan beri tahu saya! ?
Pernahkah Anda mencetak variabel atau ekspresi untuk men-debug program Anda? Jika Anda pernah mengetik sesuatu seperti
print ( foo ( '123' ))
atau lebih teliti
print ( "foo('123')" , foo ( '123' ))
maka ic()
akan membuat Anda tersenyum. Dengan argumen, ic()
memeriksa dirinya sendiri dan mencetak argumennya sendiri dan nilai argumen tersebut.
from icecream import ic
def foo ( i ):
return i + 333
ic ( foo ( 123 ))
Cetakan
ic| foo(123): 456
Demikian pula,
d = { 'key' : { 1 : 'one' }}
ic ( d [ 'key' ][ 1 ])
class klass ():
attr = 'yep'
ic ( klass . attr )
Cetakan
ic| d['key'][1]: 'one'
ic| klass.attr: 'yep'
Berikan saja ic()
variabel atau ekspresi dan selesai. Mudah.
Pernahkah Anda menggunakan print()
untuk menentukan bagian mana dari program Anda yang dieksekusi, dan urutan eksekusinya? Misalnya, jika Anda pernah menambahkan pernyataan print ke kode debug seperti
def foo ():
print ( 0 )
first ()
if expression :
print ( 1 )
second ()
else :
print ( 2 )
third ()
lalu ic()
juga membantu di sini. Tanpa argumen, ic()
memeriksa dirinya sendiri dan mencetak nama file pemanggil, nomor baris, dan fungsi induk.
from icecream import ic
def foo ():
ic ()
first ()
if expression :
ic ()
second ()
else :
ic ()
third ()
Cetakan
ic| example.py:4 in foo()
ic| example.py:11 in foo()
Panggil saja ic()
dan selesai. Sederhana.
ic()
mengembalikan argumennya, sehingga ic()
dapat dengan mudah dimasukkan ke dalam kode yang sudah ada sebelumnya.
>>> a = 6
>>> def half ( i ):
>>> return i / 2
>>> b = half(ic(a))
ic| a: 6
>>> ic(b)
ic| b: 3
ic.format(*args)
seperti ic()
tetapi output dikembalikan sebagai string alih-alih ditulis ke stderr.
>>> from icecream import ic
>>> s = ' sup '
>>> out = ic.format(s)
>>> print (out)
ic| s: 'sup'
Selain itu, keluaran ic()
dapat dinonaktifkan sepenuhnya, dan kemudian diaktifkan kembali, dengan ic.disable()
dan ic.enable()
masing-masing.
from icecream import ic
ic ( 1 )
ic . disable ()
ic ( 2 )
ic . enable ()
ic ( 3 )
Cetakan
ic| 1: 1
ic| 3: 3
ic()
terus mengembalikan argumennya ketika dinonaktifkan, tentu saja; tidak ada kode yang ada dengan ic()
yang rusak.
Untuk membuat ic()
tersedia di setiap file tanpa perlu diimpor di setiap file, Anda dapat install()
. Misalnya, di root A.py
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from icecream import install
install ()
from B import foo
foo ()
dan kemudian di B.py
, yang diimpor oleh A.py
, panggil saja ic()
:
# -*- coding: utf-8 -*-
def foo ():
x = 3
ic ( x )
install()
menambahkan ic()
ke modul bawaan, yang dibagikan di antara semua file yang diimpor oleh penerjemah. Demikian pula, ic()
nantinya dapat uninstall()
juga.
ic()
juga dapat diimpor dengan cara yang gagal jika IceCream tidak diinstal, seperti di lingkungan produksi (yaitu bukan pengembangan). Oleh karena itu, cuplikan impor cadangan ini mungkin berguna:
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)
mengontrol keluaran ic()
.
prefix
, jika disediakan, mengadopsi awalan keluaran khusus. prefix
bisa berupa string, seperti
>>> from icecream import ic
>>> ic.configureOutput( prefix = ' hello -> ' )
>>> ic( ' world ' )
hello -> 'world'
atau suatu fungsi.
>>> import time
>>> from icecream import ic
>>>
>>> def unixTimestamp ():
>>> return ' %i |> ' % int (time.time())
>>>
>>> ic.configureOutput( prefix = unixTimestamp)
>>> ic( ' world ' )
1519185860 |> 'world': 'world'
nilai default prefix
adalah ic|
.
outputFunction
, jika disediakan, dipanggil satu kali untuk setiap panggilan ic()
dengan output ic()
, sebagai string, alih-alih string tersebut ditulis ke stderr (default).
>>> import logging
>>> from icecream import ic
>>>
>>> def warn ( s ):
>>> logging.warning(s)
>>>
>>> ic.configureOutput( outputFunction = warn)
>>> ic( ' eep ' )
WARNING:root:ic| 'eep': 'eep'
argToStringFunction
, jika disediakan, dipanggil dengan nilai argumen untuk diserialisasikan ke string yang dapat ditampilkan. Standarnya adalah pprint.pformat() PrettyPrint, tetapi ini dapat diubah, misalnya, menangani tipe data non-standar dengan cara khusus.
>>> 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
defaultnya adalah icecream.argumentToString
, dan memiliki metode untuk register
dan unregister
fungsi yang akan dikirim ke kelas tertentu menggunakan functools.singledispatch
. Ia juga memiliki properti registry
untuk melihat fungsi terdaftar.
>>> 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
, jika disediakan dan True, menambahkan nama file panggilan ic()
, nomor baris, dan fungsi induk ke output 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
adalah False secara default.
contextAbsPath
, jika disediakan dan True, menghasilkan jalur file absolut, seperti /path/to/foo.py
, hanya di atas nama file, seperti foo.py
, ketika ic()
dipanggil dengan includeContext == True
. Ini berguna saat men-debug beberapa file yang memiliki nama file yang sama. Selain itu, beberapa editor, seperti VSCode, mengubah jalur file absolut menjadi tautan yang dapat diklik yang membuka file tempat ic()
dipanggil.
>>> 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
adalah False secara default.
Menginstal IceCream dengan pip itu mudah.
$ pip install icecream
ic()
menggunakan executing
oleh @alexmojaki untuk menemukan panggilan ic()
dengan andal dalam sumber Python. Itu ajaib.
Es Krim Lezat harus dinikmati dalam setiap bahasa.
Jika Anda menginginkan fungsi serupa ic()
dalam bahasa favorit Anda, silakan buka permintaan tarik! Tujuan IceCream adalah untuk mempermanis proses debug pencetakan dengan fungsi ic()
yang sangat berguna dalam setiap bahasa.