Ipython: NumPy DeprecationWarning ditangani dengan cara yang aneh

Dibuat pada 6 Apr 2018  ·  4Komentar  ·  Sumber: ipython/ipython

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

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

Semua 4 komentar

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.

https://github.com/python/cpython/pull/6622

Terima kasih @takluyver!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat