Python-检查生成器是否为空

Python-检查生成器是否为空,python,dictionary,Python,Dictionary,我正在尝试构建一个函数以返回true如果一个键已经存在于一个dict或作为该dict一部分的任何子ct中,我发现了以下解决方案: def gen_dict_extract(key, var): if hasattr(var,'iteritems'): for k, v in var.iteritems(): if k == key: yield v if isinstance(v, dict)

我正在尝试构建一个函数以返回true如果一个键已经存在于一个dict或作为该dict一部分的任何子ct中,我发现了以下解决方案:

def gen_dict_extract(key, var):
    if hasattr(var,'iteritems'):
        for k, v in var.iteritems():
            if k == key:
                yield v
            if isinstance(v, dict):
                for result in gen_dict_extract(key, v):
                    yield result
            elif isinstance(v, list):
                for d in v:
                    for result in gen_dict_extract(key, d):
                        yield result
但问题是,如果密钥已经存在,那么结果是生成器如何实现为真,如果密钥不存在,那么如何实现为假
谢谢

您应该在try/Exception块中的单个
下一个
调用和
停止迭代之外使用生成器

gen = gen_dict_extract("foo", "bar")
try:
    gen.next()
except StopIteration:
    print("this generator is empty")
请注意,此方法将“gen”保留为一个已经“生成”过一次的生成器,因此您需要创建另一个生成器来使用它


当然,使用它的最佳方法不是检查生成器是否为空,而是在使用它时处理它的“空”。

您应该在try/except块中调用单个
next
并在
StopIteration
之外使用生成器:

gen = gen_dict_extract("foo", "bar")
try:
    gen.next()
except StopIteration:
    print("this generator is empty")
请注意,此方法将“gen”保留为一个已经“生成”过一次的生成器,因此您需要创建另一个生成器来使用它


当然,使用它的最佳方法是不检查生成器是否为空,而是在使用它时处理它的“空”。

相关:顺便说一句,该代码只在Python 2上工作,因为
.iteritems
已重命名为
。在Python 3中,items
是旧的
。items
,它返回的列表已从Python 3中删除。您可能会发现该信息很有用。重写此函数以使其返回简单的True/False值可能更简单,而不是保持原样并编写空的生成器检查器。还有一个类似的问题:顺便说一句,该代码只在Python 2上工作,因为在Python 3中,
.itemritems
已重命名为
.items
,旧的
.items
,它返回的列表已从Python 3中删除。您可能会发现该信息很有用。重写此函数以使其返回简单的True/False值可能更简单,而不是保持原样并编写空的生成器检查器。还有一个类似的问题,但这也会消耗并丢弃第一个元素。(当然,如果OP只是为了查看生成器是否为非空而创建的,而不打算在以后使用它,那就完全可以了。)一种更简单的方法是,不使用
试试。。。除了
,是给
下一个
一个适当的默认参数。@tobias_k你是对的,我在编辑我的文章时添加了这个解释,而你发布:)但这也会消耗并丢弃第一个元素。(当然,如果OP只是为了查看生成器是否为非空而创建的,而不打算在以后使用它,那就完全可以了。)一种更简单的方法是,不使用
试试。。。除了
,是给
下一个
一个适当的默认参数。@tobias_k你是对的,我正在编辑我的帖子,以便在你发布时添加解释:)