2

我厌倦了像这样编写 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。)是否有我遗漏的技巧?

4

1 回答 1

3

您不能使用上下文管理器来“跳过”代码块,这就是条件的用途。上下文管理器所能做的就是挂钩块进入和退出信号,而不是控制块是否首先进入。

我会使用:

special_cat = cats.get("george")
if special_cat is not None:
    # do something with special_cat

这具有可读性和简单性的优点。任何带有生成器或上下文管理器的恶作剧都会增加代码的新维护者的惊喜。请记住:在离开代码库一两年后,您也是一个新的维护者。

于 2013-12-11T15:03:01.630 回答