每次我尝试运行app时,"RuntimeError:generator raise StopIteration"

no4*_*syn 32 python runtime-error helper web stopiteration

我正在尝试运行此代码:

import web

urls = (
    '/', 'index'
)

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()
Run Code Online (Sandbox Code Playgroud)

但它每次都给我这个错误

C:\Users\aidke\Desktop>python app.py
Traceback (most recent call last):
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\utils.py", line 526, in take
    yield next(seq)
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "app.py", line 14, in <module>
    app = web.application(urls, globals())
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\application.py", line 62, in __init__
    self.init_mapping(mapping)
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\application.py", line 130, in init_mapping
    self.mapping = list(utils.group(mapping, 2))
  File "C:\Users\aidke\AppData\Local\Programs\Python\Python37-32\lib\site-packages\web\utils.py", line 531, in group
    x = list(take(seq, size))
RuntimeError: generator raised StopIteration
Run Code Online (Sandbox Code Playgroud)

我尝试了别人的代码,发生了同样的事情.此外,我尝试重新安装web.py(实验),但它仍然无法正常工作.

Tim*_*ers 49

从文件路径判断,看起来你正在运行Python 3.7.如果是这样,你会被这里描述的3.7新行为所困扰:

PEP 479针对Python 3.7中的所有代码启用,这意味着在协同程序和生成器中直接或间接引发的StopIteration异常将转换为RuntimeError异常.(由Yury Selivanov供稿于bpo-32670.)

在此更改之前,StopIteration通过生成器引发或通过生成器只会结束生成器的使用寿命(异常被静默吞噬).您正在使用的模块必须按照3.7的预期重新编码.

他们有可能需要改变:

yield next(seq)
Run Code Online (Sandbox Code Playgroud)

至:

try:
    yield next(seq)
except StopIteration:
    return
Run Code Online (Sandbox Code Playgroud)

  • 当然,除非他们更改了应用程序,否则升级应用程序不会产生任何影响。如果他们没有,你可以自己修补。或者在你关心的应用程序符合 PEP 479 之前不要迁移到 Python 3.7。因为我在野外看到的关于这方面的报告很少,我相信这是一个罕见的问题。 (4认同)
  • 那么,如果这是在第三方应用程序中,您需要升级它吗?如果该 3rd 方应用程序未针对 PEP 479 进行修复,您是否可以解决问题? (2认同)
  • @CozyAzure,请阅读 PEP,这是您将获得的此更改的唯一理由。在此更改之前,`StopIteration` 被生成器默默地吞没,因为指定的原始生成器 PEP (255) 必须发生。因此,建议的代码只是恢复了生成器多年来的行为。 (2认同)