如何在收益中扩展元组?

Tin*_*rus 4 python yield generator python-3.x

我试图在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
Run Code Online (Sandbox Code Playgroud)

相反,我收到此错误:

    yield key, *val
               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

在元组周围添加括号:

yield (key, *val)
Run Code Online (Sandbox Code Playgroud)

yield这里特别之处在于表单只接受表达式列表,而不是starred_list表单.


Jim*_*ard 5

你需要用括号括起来.简而言之,使用:

yield (key, *val)
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过使用yield from理解来缩短它.总而言之,你__iter__看起来像:

 def __iter__(self):
    items = self._morevals.items()
    yield from ((k, *v) for k, vals in items for v in vals)
Run Code Online (Sandbox Code Playgroud)

同样,yield from用于ClassOne.__iter__:

def __iter__(self):
    yield from self._vals.items()
Run Code Online (Sandbox Code Playgroud)