首页 > 解决方案 > 生成器中的“return”和“return None”行为差异

问题描述

仅使用 return 关键字的简单方法返回一个None

def abc():
    return
print(abc())

输出:无

相似地,

def abc():
    return None
print(abc())

输出:无

但是,如果我们在生成器中使用它

def abc():
    yield 1
    return None
print(abc())

它给

SyntaxError: 'return' with argument inside generator

然而

def abc():
    yield 1
    return
print(abc())

<generator object abc at 0x7f97d7052b40>

为什么我们在行为上有这种差异?

标签: pythonpython-3.xgenerator

解决方案


裸露return对于早期从生成器中突围很有用。

同时return None只是 的一个特例return <a value>,在yield from(PEP 380) 之前,没有从生成器返回值的支持或用例。因此,为了让设计空间开放而被禁止:通过禁止在生成器中返回,Python 的设计者可以在以后使用新的语义来允许它,因为这不会破坏现有代码。

如果他们允许返回值而不做任何事情,那么用户态代码就有可能会破坏。这就是为什么从前向兼容性的角度来看,尽可能地限制API 通常更好,你让开放用户可以利用的所有东西,并且改变它会变得有风险。


推荐阅读