代码之家  ›  专栏  ›  技术社区  ›  TinyTheBrontosaurus

如何在产量中扩展元组?

  •  4
  • TinyTheBrontosaurus  · 技术社区  · 7 年前

    我试图在一个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 回复  |  直到 7 年前
        1
  •  8
  •   Martijn Pieters    7 年前

    在元组周围添加括号:

    yield (key, *val)
    

    yield 这里的特殊之处在于表单只接受表达式列表,而不接受 starred_list form

        2
  •  5
  •   Dimitris Fasarakis Hilliard    7 年前

    你需要把它括起来。简而言之,使用:

    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__

    def __iter__(self):
        yield from self._vals.items()