如何在yield语句中展开一个元组?

4
我正在尝试在yield语句中展开元组,但是出现了SyntaxError。这是否可行,或者*操作符仅用于函数调用?下面是示例:
class Inner(object):
    def __init__(self):
        self._vals = {'a': 1,
                      'b': 2,
                      'c': 3,
                      'd': 4}

    def __iter__(self):
        for key, val in self._vals.items():
            yield key, val

class Outer(object):
    def __init__(self):
        self._morevals = {"foo": Inner(),
                          "bar": Inner()}

    def __iter__(self):
        for key, moreval in self._morevals.items():
            for val in moreval:
                yield key, *val    # !!! <--- This is where the error is

object_under_test = Outer()

for outer_key, inner_key, inner_value in object_under_test:
    print("{} {} {}".format(outer_key, inner_key, inner_value))

    # Want:
    # foo a 1
    # foo b 2
    # foo c 3
    # foo d 4
    # bar a 1
    # bar b 2
    # bar c 3
    # bar d 4

相反,我收到了这个错误:
    yield key, *val
               ^
SyntaxError: invalid syntax
2个回答

8
添加括号,可以将其添加到元组周围:
yield (key, *val)

yield在这里是特殊的,因为这个形式只接受一个表达式列表,而不是一个starred_list形式。


5

您需要添加括号。简而言之,使用:

yield (key, *val)

或者,你可以使用带有推导式的yield from来缩短它。总之,你的__iter__看起来像这样:
 def __iter__(self):
    items = self._morevals.items()
    yield from ((k, *v) for k, vals in items for v in vals)

同样地,在 ClassOne.__iter__ 中使用 yield from:
def __iter__(self):
    yield from self._vals.items()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接