你如何创建一个 lambdas 的 python 列表理解?

Old*_*ool 4 python lambda list-comprehension deferred-execution

我正在尝试使用列表理解为延迟执行创建一个 lambda 列表。下面是一个简单的例子。

def func_a(message: str) -> None:
    print('a: ' + message)
    
def func_b(message: str) -> None:
    print('b: ' + message)

msg = 'some message'
funcs = [func_a, func_b]
funcs_w_args = [lambda : func(msg) for func in funcs]

for func in funcs_w_args:
    func()
Run Code Online (Sandbox Code Playgroud)

结果是

b: some message
b: some message
Run Code Online (Sandbox Code Playgroud)

而想要的结果应该是

a: some message
b: some message
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

Cyp*_*erX 5

解决方案

您想要实现的是定义partial函数(更一般地)。您可以使用functools.partial.

就是这样:

from functools import partial

# Your Code
def func_a(message: str) -> None:
    print('a: ' + message)
    
def func_b(message: str) -> None:
    print('b: ' + message)

msg = 'some message'
funcs = [func_a, func_b]

# What I changed: a list of partially-defined functions
funcs_w_args = [partial(func, msg) for func in funcs]

# Now call partially defined functions
for func in funcs_w_args:
    func()
Run Code Online (Sandbox Code Playgroud)

输出

a: some message
b: some message
Run Code Online (Sandbox Code Playgroud)

参考文献