عند إجراء عملية باستخدام NumPy 1.14 يبدو أنها مهملة ، يبدو أن التحذير يتتبع مرة أخرى إلى IPython أو IPython Kernel اعتمادًا على السياق ، وهو أمر مضلل بعض الشيء. في Jupyter Notebook ، يضيف نصًا إضافيًا قليلًا ، This is separate from the ipykernel package so we can avoid doing imports until
ويتتبع ذلك تمامًا (ومن ثم يتم رفعه هنا أولاً). لست متأكدًا مما إذا كانت هذه مشكلة في IPython أو IPython Kernel أو NumPy. هنا هو تعليم مخاطر الألغام بالرغم من ذلك.
مثال:
In [1]: import numpy as np
In [2]: a = np.arange(24).reshape(1, 2, 3, 4)
In [3]: np.expand_dims(a.min(), a.ndim)
/zopt/conda2/envs/test/bin/ipython:1: DeprecationWarning: Both axis > a.ndim and axis < -a.ndim - 1 are deprecated and will raise an AxisError in the future.
#!/zopt/conda2/envs/test/bin/python
Out[3]: array([0])
بيئة:
name: test
channels:
- conda-forge
- defaults
dependencies:
- appnope=0.1.0=py36_0
- backcall=0.1.0=py_0
- blas=1.1=openblas
- ca-certificates=2018.1.18=0
- certifi=2018.1.18=py36_0
- decorator=4.2.1=py36_0
- ipython=6.3.1=py36_0
- ipython_genutils=0.2.0=py36_0
- jedi=0.11.1=py36_0
- libgfortran=3.0.0=0
- ncurses=5.9=10
- numpy=1.14.2=py36_blas_openblas_200
- openblas=0.2.20=7
- openssl=1.0.2n=0
- parso=0.1.1=py_0
- pexpect=4.4.0=py36_0
- pickleshare=0.7.4=py36_0
- pip=9.0.3=py36_0
- prompt_toolkit=1.0.15=py36_0
- ptyprocess=0.5.2=py36_0
- pygments=2.2.0=py36_0
- python=3.6.5=1
- readline=7.0=0
- setuptools=39.0.1=py36_0
- simplegeneric=0.8.1=py36_0
- six=1.11.0=py36_1
- sqlite=3.20.1=2
- tk=8.6.7=0
- traitlets=4.3.2=py36_0
- wcwidth=0.1.7=py36_0
- wheel=0.31.0=py36_0
- xz=5.2.3=0
- zlib=1.2.11=0
نعم ، هذا نتيجة لوجود __main__
يمثل شيئين مختلفين. إنها تحاول إصدار تحذير للسطر 1 من التعليمات البرمجية التي تم إدخالها بشكل تفاعلي ، والتي يتم تشغيلها كجزء من الوحدة النمطية __main__
. لكن السطور تأتي من الوحدة النمطية الأخرى __main__
- الملف الذي شغله Python لإطلاق IPython ، أو لتشغيل النواة. لذا فإن النص الذي تراه هو السطر الأول من هذا الملف (النص This is separate...
عبارة عن سلسلة docstring).
إنها فوضوية ومربكة بعض الشيء ، لكنها لم تكن أبدًا مشكلة كبيرة بما يكفي لتكون جديرة بالإصلاح.
شعرت بالفضول وذهبت لأرى ما الذي يتطلبه الأمر لإصلاحه. يمكننا بسهولة ترك الشفرة خارج جميع التحذيرات المنسوبة إلى __main__
، لكن هذا غير مُرضٍ بعض الشيء. عرض الكود الصحيح أمر مستحيل بالنسبة لـ IPython ، بقدر ما أستطيع أن أقول ، لأن وحدة التحذيرات تبحث عن الكود بلغتها الخاصة.
يعثر Tracebacks و pdb على الملف بالقيام بما يلي:
frame.f_code.co_filename
تعثر التحذيرات على الملف بعمل ما يكافئ:
frame.f_globals.get('__file__', sys.argv[0])
نعطي كل إدخال اسم ملف مزيفًا فريدًا لرمزه ، بحيث يمكن البحث عنه بحثًا عن عمليات التتبع. لكن يتعين عليهم جميعًا مشاركة مساحة الاسم العالمية ، لذلك لا أعتقد أنه يمكننا التمييز بينهم للتحذيرات في الوقت الحالي. لقد علقت للتو على هذا في قضية بايثون القديمة .
تم دمج PR الذي أرسلته إلى Python ، لذا يجب إصلاح ذلك في Python 3.8.
takluyver شكرا!
التعليق الأكثر فائدة
تم دمج PR الذي أرسلته إلى Python ، لذا يجب إصلاح ذلك في Python 3.8.
https://github.com/python/cpython/pull/6622