我厌倦了像这样编写 Python (2.7) 代码:
if "george" in cats and cats["george"] is not None:
special_cat = cats["george"]
# do something with special_cat
所以我写了一个生成器,它返回零个或一个对象:
def maybe_get(d, k):
if k in d and d[k] is not None:
yield d[k]
else:
return
现在我可以使更多的原始代码片段更紧凑,如下所示:
for special_cat in maybe_get(cats, "george"):
# do something with special_cat
不过,为此目的使用 for 循环看起来很奇怪。我宁愿使用上下文管理器:
with maybe_get(cats, "george") as special_cat:
# do something with special_cat
但是我想不出任何方法让上下文管理器跳过它管理的代码块。(@contextmanager
例如,如果生成器没有产生至少一个值,则装饰器将引发 a RuntimeError
。)是否有我遗漏的技巧?