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
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.
Obrigado @takluyver!
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