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 }
}
حقوق الطبع والنشر (ج) لعام 2019 محفوظة لرام راتشوم والمتعاونين معه، وتم إصدارها بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.
موضوع Hacker News و/r/Python Reddit (22 أبريل 2019)