- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 python docs 提供的 grouper
配方的修改形式:
from itertools import chain, islice
def grouper(iterable, n):
iterable = iter(iterable)
while True:
peek = next(iterable)
yield chain((peek,), islice(iterable, n - 1))
这似乎工作正常。我可以做这样的事情:
>>> x = bytearray(range(16))
>>> [int.from_bytes(n, 'big') for n in grouper(x, 4)]
[66051, 67438087, 134810123, 202182159]
但是,当我在 IPython 中运行完全相同的代码时,我收到一个 DeprecationWarning
:
In [1]: from itertools import chain, islice
...: def grouper(iterable, n):
...: iterable = iter(iterable)
...: while True:
...: peek = next(iterable)
...: yield chain((peek,), islice(iterable, n - 1))
In [2]: x = bytearray(range(16))
In [3]: [int.from_bytes(n, 'big') for n in grouper(x, 4)]
__main__:1: DeprecationWarning: generator 'grouper' raised StopIteration
Out[3]: [66051, 67438087, 134810123, 202182159]
警告从何而来?为什么我在常规 Python 控制台中看不到它?我该怎么做才能让警告消失?
我使用的是 Python 3.6.2 和 IPython 6.1.0
最佳答案
这是对 Python 的一项更改,正在 Python 3.5 和 Python 3.7 之间逐步进行。详细说明PEP 479 ,但我会尝试快速概述。
问题是从生成器函数中泄漏的 StopIteration
异常。看起来这似乎没什么问题,因为引发 StopIteration
是迭代器完成的信号。但它可能会导致重构生成器出现问题。下面是一个显示问题的示例:
假设您有这个生成器函数(在 3.5 之前的 Python 版本中工作正常,它开始发出警告):
def gen():
yield 1
yield 2
if True:
raise StopIteration
yield 3
yield 4
由于 if
的条件为真,生成器将在生成两个值后停止(不生成 3
或 4
)。但是,如果您尝试重构函数的中间部分怎么办?如果将部分从 yield 2
移动到 yield 3
到辅助生成器中,您会看到一个问题:
def gen():
yield 1
yield from refactored_helper()
yield 4
def refactored_helper():
yield 2
if True:
raise StopIteration
yield 3
在此版本中,3
将被跳过,但 4
仍将产生。这是因为 yield from
吃掉了辅助生成器函数中引发的 StopIteration
。它假设只应该停止辅助生成器,因此外部生成器继续运行。
为了解决这个问题,Python 开发人员决定改变生成器的工作方式。从 Python 3.7 开始,从生成器函数泄漏的 StopIteration
异常将被解释器更改为 RuntimeError
异常。如果你想正常退出一个生成器,你需要使用return
。此外,您现在可以从生成器函数返回
一个值。该值将包含在由生成器机制引发的 StopIteration
异常中,并且 yield from
表达式将计算出返回值。
因此上面的生成器可以正确地重构为:
def gen():
yield 1
if yield from refactored_helper():
return
yield 4
def refactored_helper():
yield 2
if True:
return True
yield 3
# like a normal function, a generator returns None if it reaches the end of the code
如果您现在想编写与 future 兼容的代码,您应该将 from __future__ import Generator_stop
放在模块的顶部。然后,您需要跟踪泄漏 StopIteration
异常的位置,并用 try
和 except
逻辑包装它们。对于您问题中的代码:
from __future__ import generator_stop
from itertools import chain, islice
def grouper(iterable, n):
iterable = iter(iterable)
while True:
try:
peek = next(iterable)
except StopIteration:
return
yield chain((peek,), islice(iterable, n - 1))
关于python - 使用 IPython 时生成器中出现意外的 DeprecationWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604899/
%matplotlib 笔记本 import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklea
我们正在将我们的应用程序从 Django 1.6 更新到 1.7。 我们看到很多这样的消息:RemovedInDjango18Warning 有没有办法过滤它们?它们在导入过程中被释放。 我们尝试了
我已经升级到 Django 1.4,现在当我运行我的开发服务器时,我收到以下警告: /home/flc/venvs/myprj/lib/python2.6/site-packages/django/v
我的一些程序运行没有问题,但我仍然收到以下错误代码。它对程序本身没有影响,但我仍然想解决它。 C:\Program Files\JetBrains\PyCharm Community Edition
我最近升级到 numpy 1.9dev。(为了改进 OpenBlas 支持)。 我有一些代码可以执行 x-y其中 x 和 y 是来自概率分布的样本。如果分布是伯努利分布,则它们是 bool 值。如果分
首先我查看了所有相关问题。给出了非常相似的问题。 所以我遵循了链接中的建议,但没有一个对我有用。 Data Conversion Error while applying a function to
我正在使用 python docs 提供的 grouper 配方的修改形式: from itertools import chain, islice def grouper(iterable, n):
我相信这个问题已经被提出了很多次,但我有一个特定的用例,我无法使用网络上描述的许多方法解决问题。 在我的一个项目中,我正在使用 joblib 库,它显示 DeprecationWarning 因为它在
我经常从我无法控制的库中得到很多弃用,我不想用它们污染测试执行。 如何在不冒从我自己的代码中禁用弃用的风险的情况下避免这种情况? 例子: ===============================
我已经搜索过了,但无法完全找到答案。我想要一个来自 sympy 的具有特定维度的 Matrix 的简单子(monad)类。当我在 python 2.7 中运行此代码时: from sympy impo
已经应用了 require('events') 但仍然不断显示警告,我在这里做错了什么?为什么 process.EventEmitter 即使未使用也会一直显示? Node v6.7.0 它可以工作,
我最近在我的一台机器上更新了 Python 的 Numpy 包,显然我一直依赖 a deprecated feature of numpy现在有一段时间了: >>> np.__version__ '1
我在将模型的预测与训练集的标签进行比较时遇到了问题。我使用的数组具有以下形状: Training set (200000, 28, 28) (200000,) Validation set (1000
使用文档运行 rasa_core 示例 › python3 -m rasa_core.run -d models/dialogue -u models/nlu/default/current 并在对话
尝试更新 MongoDB 文档获取弃用警告为 (node:71307) [DEP0079] DeprecationWarning: Custom inspection function on Obje
当我运行 pytest 时,我收到了来自 3rd 方库的一些弃用警告。我想知道我自己的代码中的任何弃用警告,但不是在与另一个 3rd 方库捆绑在一起的库的供应商副本中。 This answer帮助我中
我是当我尝试运行 nodemon app.js socioboard-api/user 时,出现以下错误 [nodemon] 1.19.3 [nodemon] to restart at any ti
我想使用以下方法获取帖子文档的数量: db.collection('posts').count() 但是,我收到了警告: DeprecationWarning: collection.count is
我有一段代码如下(使用 python 2.7.12 运行): self.config = ConfigParser() self.config.read(self.config_file) 其中 se
DeprecationWarning、PendingDeprecationWarning 和 FutureWarning 之间有什么区别?我在Python 3 documentation中看到目标“受
我是一名优秀的程序员,十分优秀!