Ipython: Aviso de descontinuação do NumPy tratado de forma estranha

Criado em 6 abr. 2018  ·  4Comentários  ·  Fonte: ipython/ipython

Ao realizar uma operação com NumPy 1.14 que parece estar obsoleta, o aviso parece estar rastreando o IPython ou o Kernel do IPython dependendo do contexto, o que é um pouco enganador. No Jupyter Notebook, ele adiciona um pequeno texto extra afirmando, This is separate from the ipykernel package so we can avoid doing imports until e desaparece assim (portanto, levantando aqui primeiro). Não tenho certeza se isso é um problema no IPython, no Kernel do IPython ou NumPy. Aqui está um MRE.


Exemplo:

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



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

Comentários muito úteis

Um PR que enviei ao Python foi mesclado, então isso deve ser corrigido no Python 3.8.

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

Todos 4 comentários

Sim, isso é o resultado de __main__ representar duas coisas diferentes. Ele está tentando emitir um aviso para a linha 1 do seu código inserido interativamente, que é executado como parte do módulo __main__ . Mas as linhas estão vindo do outro módulo __main__ - o arquivo que o Python executou para iniciar o IPython ou para iniciar o kernel. Portanto, o texto que você vê é a primeira linha desse arquivo (o texto This is separate... é uma docstring).

É um pouco bagunçado e confuso, mas nunca foi um problema grande o suficiente para valer a pena consertar.

Fiquei curioso e fui ver o que seria necessário para consertar. Poderíamos facilmente deixar o código de fora de todos os avisos atribuídos a __main__ , mas isso é um pouco insatisfatório. Mostrar o código correto é impossível para o IPython, pelo que eu posso dizer, porque o módulo warnings procura o código em seu próprio idioma peculiar.

Tracebacks e pdb localizam o arquivo fazendo:

frame.f_code.co_filename

Avisos encontra o arquivo fazendo o equivalente a:

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

Damos a cada entrada um nome de arquivo falso exclusivo para seu código, de forma que ele possa ser procurado em busca de rastreamentos. Mas todos eles precisam compartilhar o namespace global, então não acho que podemos distingui-los para avisos no momento. Acabei de comentar sobre isso em um antigo problema do Python .

Um PR que enviei ao Python foi mesclado, então isso deve ser corrigido no Python 3.8.

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

Obrigado @takluyver!

Esta página foi útil?
0 / 5 - 0 avaliações