我有一个函数,我需要根据某些变量调用一定数量的参数,如下所示:
self.model = Gtk.ListStore(str for i in len(dictionary))
当然这不起作用,因为str for i in len(dictionary)
结果是一个列表:[str, str, str, str]
虽然我总是可以为每个替代方案写 4 行和一堆 if 语句,但必须有更好的方法来做到这一点。
我有一个函数,我需要根据某些变量调用一定数量的参数,如下所示:
self.model = Gtk.ListStore(str for i in len(dictionary))
当然这不起作用,因为str for i in len(dictionary)
结果是一个列表:[str, str, str, str]
虽然我总是可以为每个替代方案写 4 行和一堆 if 语句,但必须有更好的方法来做到这一点。
也许您可以使用 * 语法?
self.model = Gtk.ListStore(*[str for i in len(dictionary)])
* 解包列表并将每个元素作为单独的参数传递给函数。
如果您正在调用的函数使用*args
,那么您可以使用我认为所谓的 splat 运算符 - *
。
例子:
def f(*arbitrary_amount_of_arguments):
for i in arbitrary_amount_of_arguments:
print(i)
>>> f("a", "b", "c")
a
b
c
>>> f(*[1, 2, 3, 4, 5, 6, 7])
1
2
3
4
5
6
7
或者在您的具体示例中:
self.model = Gtk.ListStore(*(str for i in range(len(dictionary))))
我还想问一下你是否想str
为 i in range(len(dictionary)) 传递内置字符串类。
编辑:self.model = Gtk.ListStore(*(str for _ in enumerate(dictionary)))
或者 self.model = Gtk.ListStore(*[[str] * len(dictionary))
可能比我之前的建议更好,因为它们更 Pythonic。
要重复相同的值 x 次,只需将其乘以一个 int:
Gtk.ListStore(*[str]*len(dictionary))
对于任意生成器,在生成器前加一个星号来解压它:
Gtk.ListStore(*(x for bar in spam))
请注意,不需要临时列表。