PySnooper — отладчик для бедняков. Если вы использовали Bash, это похоже на set -x
для Python, только он более интересен.
Ваша история: вы пытаетесь выяснить, почему ваш код Python не делает того, что, по вашему мнению, он должен делать. Вы хотели бы использовать полноценный отладчик с точками останова и часами, но сейчас у вас нет времени на его настройку.
Вы хотите знать, какие строки выполняются, а какие нет, и каковы значения локальных переменных.
Большинство людей будут использовать строки print
в стратегических местах, некоторые из них показывают значения переменных.
PySnooper позволяет вам сделать то же самое, за исключением того, что вместо тщательного создания правильных строк print
вы просто добавляете одну строку декоратора к интересующей вас функции. Вы получите пошаговый журнал вашей функции, в том числе, какие строки запускался и когда и когда именно были изменены локальные переменные.
Что отличает PySnooper от всех других инструментов анализа кода? Вы можете использовать его в своей дерьмовой, разросшейся корпоративной кодовой базе без необходимости какой-либо настройки. Просто включите декоратор, как показано ниже, и перенаправьте вывод в выделенный файл журнала, указав его путь в качестве первого аргумента.
Мы пишем функцию, которая преобразует число в двоичное, возвращая список битов. Давайте посмотрим на это, добавив декоратор @pysnooper.snoop()
:
import pysnooper
@ pysnooper . snoop ()
def number_to_bits ( number ):
if number :
bits = []
while number :
number , remainder = divmod ( number , 2 )
bits . insert ( 0 , remainder )
return bits
else :
return [ 0 ]
number_to_bits ( 6 )
Вывод в stderr:
Или, если вы не хотите отслеживать всю функцию, вы можете обернуть соответствующую часть в блок with
:
import pysnooper
import random
def foo ():
lst = []
for i in range ( 10 ):
lst . append ( random . randrange ( 1 , 1000 ))
with pysnooper . snoop ():
lower = min ( lst )
upper = max ( lst )
mid = ( lower + upper ) / 2
print ( lower , mid , upper )
foo ()
который выводит что-то вроде:
New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line 10 lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line 11 upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12 mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13 print(lower, mid, upper)
Elapsed time: 00:00:00.000344
Если вам сложно получить доступ к stderr, вы можете перенаправить вывод в файл:
@ pysnooper . snoop ( '/my/log/file.log' )
Вместо этого вы также можете передать поток или вызываемый объект, и они будут использоваться.
Просмотрите значения некоторых выражений, которые не являются локальными переменными:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
Покажите строки отслеживания для функций, которые вызывает ваша функция:
@ pysnooper . snoop ( depth = 2 )
Дополнительные параметры см. в разделе «Расширенное использование». <------
Лучший способ установить PySnooper — с помощью Pip:
$ pip install pysnooper
Конда с каналом конда-форж:
$ conda install -c conda-forge pysnooper
Арч Линукс:
$ yay -S python-pysnooper
Федора Линукс:
$ dnf install python3-pysnooper
Если вы используете PySnooper в академической работе, используйте следующий формат цитирования:
@software { rachum2019pysnooper ,
title = { PySnooper: Never use print for debugging again } ,
author = { Rachum, Ram and Hall, Alex and Yanokura, Iori and others } ,
year = { 2019 } ,
month = { jun } ,
publisher = { PyCon Israel } ,
doi = { 10.5281/zenodo.10462459 } ,
url = { https://github.com/cool-RR/PySnooper }
}
Авторские права (c) принадлежат Раму Рахуму и соавторам, 2019 г., выпущено по лицензии MIT.
Ветка Hacker News и ветка /r/Python Reddit (22 апреля 2019 г.)