Ipython: NumPy DeprecationWarning géré de manière étrange

Créé le 6 avr. 2018  ·  4Commentaires  ·  Source: ipython/ipython

Lors de l'exécution d'une opération avec NumPy 1.14 qui semble être obsolète, l'avertissement semble remonter à IPython ou au noyau IPython en fonction du contexte, ce qui est un peu trompeur. Dans le Jupyter Notebook, il ajoute un petit texte supplémentaire indiquant, This is separate from the ipykernel package so we can avoid doing imports until et s'arrête comme ça (d'où l'augmentation ici en premier). Je ne sais pas s'il s'agit d'un problème dans IPython, le noyau IPython ou NumPy. Voici un MRE cependant.


Exemple:

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



Environnement:

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

Commentaire le plus utile

Un PR que j'ai soumis à Python a été fusionné, cela devrait donc être corrigé dans Python 3.8.

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

Tous les 4 commentaires

Oui, c'est parce que __main__ représente deux choses différentes. Il essaie d'émettre un avertissement pour la ligne 1 de votre code entré de manière interactive, qui est exécuté dans le cadre du module __main__ . Mais les lignes proviennent de l'autre module __main__ - le fichier que Python a exécuté pour lancer IPython ou pour lancer le noyau. Ainsi, le texte que vous voyez est la première ligne de ce fichier (le texte This is separate... est une docstring).

C'est un peu désordonné et déroutant, mais cela n'a jamais vraiment été un problème assez important pour valoir la peine d'être résolu.

Je suis devenu curieux et je suis allé voir ce qu'il faudrait pour le réparer. Nous pourrions assez facilement laisser le code en dehors de tous les avertissements attribués à __main__ , mais c'est un peu insatisfaisant. Pour autant que je sache, afficher le code correct est impossible pour IPython, car le module d'avertissement recherche le code dans son propre idiome particulier.

Tracebacks et pdb trouvent le fichier en faisant :

frame.f_code.co_filename

Warnings trouve le fichier en effectuant l'équivalent de :

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

Nous donnons à chaque entrée un faux nom de fichier unique pour son code, afin qu'il puisse être recherché pour les retraçages. Mais ils doivent tous partager l'espace de noms global, donc je ne pense pas que nous puissions les distinguer pour les avertissements pour le moment. Je viens de commenter cela sur un ancien problème Python .

Un PR que j'ai soumis à Python a été fusionné, cela devrait donc être corrigé dans Python 3.8.

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

Merci @takluyver !

Cette page vous a été utile?
0 / 5 - 0 notes