【发布时间】:2021-09-09 18:54:34
【问题描述】:
我正在查看一位同事的代码,我觉得这是对 yield 语句的不必要使用。是这样的:
def standardize_text(text: str):
pattern = r"ABC" # some regex
yield re.sub(pattern, "X", text)
def preprocess_docs(docs: List[str]):
for doc in docs:
yield standardize_text(doc)
我了解preprocess_docs 中yield 的使用,以便我可以返回一个生成器,如果docs 是一个大列表,这将很有帮助。但我不明白standardize_text 函数中yield 的值。对我来说,return 声明会做同样的事情。
yield 有用吗?
【问题讨论】:
-
我认为你是对的 - 我看不到对字符串进行一次 yield 的好处。
-
我很好奇你为什么不直接问你的同事......(作为记录,我没有看到一个很好的理由,但我不是 Python 生成器方面的专家)跨度>
-
return不会做同样的事情,它会使preprocess_docs成为一个简单的值生成器,而不是(单个元素)生成器的生成器。我无法想象为什么你会想要那个,但还是有区别的。将preprocess_docs更改为使用yield from而不是yield会产生相同的效果(尽管它几乎肯定会比使用普通yield的return慢)。 -
是的,没用。此外,如果你要注释你的参数,你应该注释你的返回类型。如果您的同事对该代码进行了类型注释(使用 mypy 确保注释正确),他们可能会自己意识到返回
Generator[Generator[str]]实际上并不是他们想要做的。