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)
在元组周围添加括号:
yield (key, *val)
Run Code Online (Sandbox Code Playgroud)
yield这里特别之处在于表单只接受表达式列表,而不是starred_list表单.
你需要用括号括起来.简而言之,使用:
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)
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |