Ipython: Предупреждение об устаревании NumPy обрабатывается странным образом

Созданный на 6 апр. 2018  ·  4Комментарии  ·  Источник: ipython/ipython

При выполнении операции с NumPy 1.14, которая кажется устаревшей, предупреждение, похоже, отслеживает обратную связь с IPython или ядром IPython в зависимости от контекста, что немного вводит в заблуждение. В Jupyter Notebook он добавляет небольшой дополнительный текст с указанием This is separate from the ipykernel package so we can avoid doing imports until и останавливается точно так же (следовательно, сначала поднимается здесь). Не уверен, что это проблема в IPython, ядре IPython или NumPy. А вот и MRE.


Пример:

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

Самый полезный комментарий

PR, который я отправил в Python, был объединен, поэтому это должно быть исправлено в Python 3.8.

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

Все 4 Комментарий

Ага, это результат того, что __main__ представляют две разные вещи. Он пытается выдать предупреждение для строки 1 вашего кода, введенного в интерактивном режиме, который запускается как часть модуля __main__ . Но строки поступают из другого модуля __main__ - файла, который Python запускал для запуска IPython или для запуска ядра. Итак, текст, который вы видите, является первой строкой этого файла (текст This is separate... - это строка документации).

Это немного запутанно и запутанно, но никогда не было достаточно большой проблемой, чтобы ее стоило исправить.

Мне стало любопытно, и я пошел посмотреть, что нужно сделать, чтобы это исправить. Мы могли бы легко исключить код из всех предупреждений, связанных с __main__ , но это немного неудовлетворительно. Насколько я могу судить, отображение правильного кода для IPython невозможно, потому что модуль предупреждений ищет код на своей собственной специфической идиоме.

Tracebacks и pdb находят файл, выполнив:

frame.f_code.co_filename

Warnings находит файл, выполнив эквивалент:

frame.f_globals.get('__file__', sys.argv[0])

Мы даем каждому входу уникальное поддельное имя файла для его кода, чтобы его можно было найти для трассировки. Но все они должны совместно использовать глобальное пространство имен, поэтому я не думаю, что в настоящий момент мы можем различить их для предупреждений. Я только что прокомментировал это по поводу древней проблемы с Python .

PR, который я отправил в Python, был объединен, поэтому это должно быть исправлено в Python 3.8.

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

Спасибо @takluyver!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги