Saat melakukan operasi dengan NumPy 1.14 yang tampaknya tidak digunakan lagi, peringatan tersebut tampaknya melacak kembali ke IPython atau Kernel IPython tergantung pada konteksnya, yang agak menyesatkan. Di Jupyter Notebook, ia menambahkan sedikit teks tambahan yang menyatakan, This is separate from the ipykernel package so we can avoid doing imports until
dan menghilang begitu saja (karenanya dimunculkan di sini dulu). Tidak yakin apakah ini masalah di IPython, Kernel IPython, atau NumPy. Berikut adalah MRE sekalipun.
Contoh:
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])
Lingkungan:
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
Yup, ini adalah hasil dari memiliki __main__
mewakili dua hal yang berbeda. Itu mencoba mengeluarkan peringatan untuk baris 1 dari kode Anda yang dimasukkan secara interaktif, yang dijalankan sebagai bagian dari modul __main__
. Tetapi baris-baris tersebut berasal dari modul __main__
- file yang dijalankan Python untuk meluncurkan IPython, atau untuk meluncurkan kernel. Jadi teks yang Anda lihat adalah baris pertama dari file itu (teks This is separate...
adalah docstring).
Ini agak berantakan dan membingungkan, tetapi tidak pernah benar-benar menjadi masalah yang cukup besar untuk diperbaiki.
Saya penasaran dan pergi untuk melihat apa yang diperlukan untuk memperbaikinya. Kami dapat dengan mudah mengabaikan kode dari semua peringatan yang dikaitkan dengan __main__
, tetapi itu agak tidak memuaskan. Menampilkan kode yang benar tidak mungkin untuk IPython, sejauh yang saya tahu, karena modul peringatan mencari kode dalam idiomnya sendiri yang aneh.
Tracebacks dan pdb menemukan file dengan melakukan:
frame.f_code.co_filename
Peringatan menemukan file dengan melakukan hal yang sama dengan:
frame.f_globals.get('__file__', sys.argv[0])
Kami memberikan setiap masukan nama file palsu yang unik untuk kodenya, sehingga dapat dicari untuk traceback. Tapi mereka semua harus berbagi namespace global, jadi saya rasa kita tidak bisa membedakan mereka untuk peringatan saat ini. Saya baru saja berkomentar tentang ini pada masalah Python kuno .
PR yang saya kirimkan ke Python telah digabungkan, jadi ini harus diperbaiki dengan Python 3.8.
Terima kasih @takluyver!
Komentar yang paling membantu
PR yang saya kirimkan ke Python telah digabungkan, jadi ini harus diperbaiki dengan Python 3.8.
https://github.com/python/cpython/pull/6622