在列表理解中使用元组解包创建对象
Object creation with tuple unpacking within a list comprehension
我很好奇我是否可以解压从函数返回的元组并使用解压后的值创建对象,所有这些都在列表理解范围内。
我希望使用的代码如下所示:
data = [
Availability(
user=random.randrange(100),
start_time, end_time=generateTimes(),
)
for x in range(10000)
]
上面的代码给出了错误SyntaxError: positional argument follows keyword argument
。如果可能的话,我更愿意使用列表理解而不是传统的 for 循环。
start_time, end_time=generateTimes()
这不会解压缩 return 值。这将改为传递(可能未定义的)变量 start_time
作为位置参数(这就是为什么你得到 SyntaxError
),以及来自 generateTimes()
的两个 return 值作为关键字争论。像你那样做是不可能的,你唯一的希望如下:
如果你有这样定义的 Availability
构造函数:
def __init__(self, user=0, start_time=0, end_time=1)
您可以省略关键字并像位置参数一样传递参数。
Availability(
random.randrange(100),
*generateTimes()
)
但是如果您的 Availability class 构造函数有超过这三个关键字参数,这很可能不起作用。然后,你必须像这样调用函数两次:
Availability(
random.randrange(100),
start_time=generateTimes()[0],
end_time=generateTimes[1]
)
编辑
我使用 map()
:
找到了另一个解决方案(虽然未经测试)
data = [
Availability(
user=random.randrange(100),
start_time=start_time, end_time=end_time
)
for start_time, end_time in map(lambda _: generateTimes(), range(10000))
]
我很好奇我是否可以解压从函数返回的元组并使用解压后的值创建对象,所有这些都在列表理解范围内。
我希望使用的代码如下所示:
data = [
Availability(
user=random.randrange(100),
start_time, end_time=generateTimes(),
)
for x in range(10000)
]
上面的代码给出了错误SyntaxError: positional argument follows keyword argument
。如果可能的话,我更愿意使用列表理解而不是传统的 for 循环。
start_time, end_time=generateTimes()
这不会解压缩 return 值。这将改为传递(可能未定义的)变量 start_time
作为位置参数(这就是为什么你得到 SyntaxError
),以及来自 generateTimes()
的两个 return 值作为关键字争论。像你那样做是不可能的,你唯一的希望如下:
如果你有这样定义的 Availability
构造函数:
def __init__(self, user=0, start_time=0, end_time=1)
您可以省略关键字并像位置参数一样传递参数。
Availability(
random.randrange(100),
*generateTimes()
)
但是如果您的 Availability class 构造函数有超过这三个关键字参数,这很可能不起作用。然后,你必须像这样调用函数两次:
Availability(
random.randrange(100),
start_time=generateTimes()[0],
end_time=generateTimes[1]
)
编辑
我使用 map()
:
data = [
Availability(
user=random.randrange(100),
start_time=start_time, end_time=end_time
)
for start_time, end_time in map(lambda _: generateTimes(), range(10000))
]