Ipython: NumPy DeprecationWarning 以奇怪的方式处理

创建于 2018-04-06  ·  4评论  ·  资料来源: ipython/ipython

当使用 NumPy 1.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 被合并了,所以这应该在 Python 3.8 中修复。

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

所有4条评论

是的,这是__main__代表两种不同事物的结果。 它试图对交互式输入的代码的第 1 行发出警告,该代码作为__main__模块的一部分运行。 但是这些行来自另一个__main__模块 - Python 运行以启动 IPython 或启动内核的文件。 所以你看到的文本是该文件的第一行( This is separate...文本是一个文档字符串)。

这有点混乱和混乱,但它从来都不是一个值得修复的大问题。

我很好奇,就去看看修复它需要什么。 我们可以很容易地将代码从归因于__main__的所有警告中删除,但这有点不令人满意。 据我所知,对于 IPython 来说,显示正确的代码是不可能的,因为警告模块会用它自己特有的习惯用法来查找代码。

Tracebacks 和 pdb 通过执行以下操作找到文件:

frame.f_code.co_filename

警告通过执行以下等效操作来查找文件:

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

我们为每个输入的代码提供一个唯一的假文件名,以便可以查找回溯。 但是它们都必须共享全局命名空间,因此我认为我们目前无法区分它们以进行警告。 我刚刚在一个古老的 Python 问题上对此发表了评论。

我提交给 Python 的 PR 被合并了,所以这应该在 Python 3.8 中修复。

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

谢谢@takluyver!

此页面是否有帮助?
0 / 5 - 0 等级