코드를 디버그하기 위해 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()
사용해 본 적이 있습니까? 예를 들어 다음과 같은 코드를 디버그하기 위해 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 ()
그런 다음 A.py
에서 가져온 B.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
은 제공된 경우 해당 문자열이 stderr(기본값)에 기록되는 대신 문자열로 ic()
의 출력을 사용하여 모든 ic()
호출에 대해 한 번 호출됩니다.
>>> import logging
>>> from icecream import ic
>>>
>>> def warn ( s ):
>>> logging.warning(s)
>>>
>>> ic.configureOutput( outputFunction = warn)
>>> ic( ' eep ' )
WARNING:root:ic| 'eep': 'eep'
argToStringFunction
은 제공되는 경우 표시 가능한 문자열로 직렬화될 인수 값과 함께 호출됩니다. 기본값은 PrettyPrint의 pprint.pformat()이지만 이는 예를 들어 사용자 정의 방식으로 비표준 데이터 유형을 처리하도록 변경할 수 있습니다.
>>> 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
이며 functools.singledispatch
사용하여 특정 클래스에 대해 전달될 함수를 register
및 unregister
메서드가 있습니다. 또한 등록된 기능을 볼 수 있는 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
기본적으로 False입니다.
contextAbsPath
제공되고 True인 경우 ic()
includeContext == True
로 호출될 때 foo.py
와 같은 파일 이름 위에 /path/to/foo.py
와 같은 절대 파일 경로를 출력합니다. 이는 동일한 파일 이름을 공유하는 여러 파일을 디버깅할 때 유용합니다. 또한 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
기본적으로 False입니다.
pip를 사용하여 IceCream을 설치하는 것은 쉽습니다.
$ pip install icecream
ic()
@alexmojaki 의 executing
사용하여 Python 소스에서 ic()
호출을 안정적으로 찾습니다. 그것은 마술이다.
맛있는 아이스크림은 모든 언어로 즐겨야 합니다.
선호하는 언어로 유사한 ic()
기능을 원하시면 풀 리퀘스트를 열어주세요! IceCream의 목표는 모든 언어에서 간편하고 멋진 ic()
함수를 사용하여 인쇄 디버깅을 향상시키는 것입니다.