Ipython: NumPyDeprecationWarningが奇妙な方法で処理されました

作成日 2018年04月06日  ·  4コメント  ·  ソース: ipython/ipython

非推奨のように見えるNumPy1.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

最も参考になるコメント

Pythonに送信したPRがマージされたため、Python3.8で修正する必要があります。

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

全てのコメント4件

うん、これは__main__が2つの異なるものを表すようにした結果です。 __main__モジュールの一部として実行される、インタラクティブに入力されたコードの1行目に警告を発行しようとしています。 しかし、行は他の__main__モジュール(PythonがIPythonを起動するため、またはカーネルを起動するために実行したファイル)から来ています。 したがって、表示されるテキストはそのファイルの最初の行です( This is separate...テキストはdocstringです)。

少し面倒で紛らわしいですが、修正する価値のある大きな問題ではありませんでした。

私は興味を持ち、それを修正するのに何が必要かを見に行きました。 __main__に起因するすべての警告からコードを簡単に除外することができますが、それは少し不十分です。 警告モジュールは独自のイディオムでコードを検索するため、私が知る限り、IPythonでは正しいコードを表示することは不可能です。

トレースバックとpdbは、次の方法でファイルを検索します。

frame.f_code.co_filename

警告は、次と同等の処理を実行してファイルを検索します。

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

各入力にそのコードの一意の偽のファイル名を指定して、トレースバックを検索できるようにします。 しかし、それらはすべてグローバル名前空間を共有する必要があるため、現時点では警告のためにそれらを区別することはできないと思います。 古代のPythonの問題についてコメントしました。

Pythonに送信したPRがマージされたため、Python3.8で修正する必要があります。

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

ありがとう@takluyver!

このページは役に立ちましたか?
0 / 5 - 0 評価