Ipython: Advertencia de desaprobación de NumPy manejada de manera extraña

Creado en 6 abr. 2018  ·  4Comentarios  ·  Fuente: ipython/ipython

Al realizar una operación con NumPy 1.14 que parece estar en desuso, la advertencia parece estar rastreando a IPython o al Kernel de IPython según el contexto, lo cual es un poco engañoso. En el Cuaderno de Jupyter, agrega un poco de texto adicional que indica, This is separate from the ipykernel package so we can avoid doing imports until y se desvanece así (por lo tanto, aumente aquí primero). No estoy seguro de si esto es un problema en IPython, el kernel de IPython o NumPy. Sin embargo, aquí hay un MRE.


Ejemplo:

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])



Medio ambiente:

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

Comentario más útil

Un PR que envié a Python se fusionó, por lo que esto debería corregirse en Python 3.8.

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

Todos 4 comentarios

Sí, esto es el resultado de que __main__ representen dos cosas diferentes. Está intentando emitir una advertencia para la línea 1 de su código ingresado de forma interactiva, que se ejecuta como parte del módulo __main__ . Pero las líneas provienen del otro módulo __main__ : el archivo que ejecutó Python para iniciar IPython o para iniciar el kernel. Entonces, el texto que ve es la primera línea de ese archivo (el texto This is separate... es una cadena de documentos).

Es un poco complicado y confuso, pero nunca ha sido un problema lo suficientemente grande como para que valga la pena solucionarlo.

Sentí curiosidad y fui a ver qué se necesitaba para solucionarlo. Fácilmente podríamos dejar el código fuera de todas las advertencias atribuidas a __main__ , pero eso es un poco insatisfactorio. Mostrar el código correcto es imposible para IPython, hasta donde yo sé, porque el módulo de advertencias busca código en su propio idioma peculiar.

Tracebacks y pdb encuentran el archivo haciendo:

frame.f_code.co_filename

Warnings encuentra el archivo haciendo el equivalente a:

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

Le damos a cada entrada un nombre de archivo falso único para su código, de modo que se pueda buscar en busca de rastreos. Pero todos tienen que compartir el espacio de nombres global, por lo que no creo que podamos distinguirlos por advertencias en este momento. Acabo de comentar sobre esto en un antiguo problema de Python .

Un PR que envié a Python se fusionó, por lo que esto debería corregirse en Python 3.8.

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

¡Gracias @takluyver!

¿Fue útil esta página
0 / 5 - 0 calificaciones