lambda 表达式 return 具有多个参数的列表中的函数名称

lambda expresion that return the names of the function from a list that have more then one parameter

我需要做一个 lambda 表达式,return 列表中的函数名称有一个以上的参数,我写了下面的代码,但没有给我它的函数名称return 这个 <函数 funB 在 0x01FDBE80>。我该如何解决?

def funA():
    pass

def funB(a):
    pass

def funC(a, b):
    pass

n = [funA, funB, funC]
m = list(filter(lambda x: x.__name__ if x.__code__.co_argcount > 0 else None, n))
print(m)

问题是 filter 使用它作为布尔谓词给出的函数纯粹是为了过滤而不是为了改变产生的值。

在这个例子中,它会将 x.__name__ if x.__code__.co_argcount > 0 else NoneTrue 的所有函数添加到生成的生成器中,但它会按原样添加函数对象本身,而不是它的 .__name__属性。

来自docs

Construct an iterator from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed. Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item)) if function is not None and (item for item in iterable if item) if function is None.

这就是为什么

m = list(filter(lambda x: x.__code__.co_argcount > 0, n))

将给出与您当前拥有的代码相同的输出。

在这种情况下你不应该使用 filter:

m = list(f.__name__ for f in n if f.__code__.co_argcount > 0)

为了避免这种副作用,只需添加进一步的步骤(参见 DeepSpace 的解释),过滤并使用 map 检索名称(根据需要)。

fs = [funA, funB, funC]

fs_filtered = map(lambda f: f.__name__, filter(lambda f: f if f.__code__.co_argcount > 0 else None , fs))

print(list(fs_filtered))

或更好:

fs_filtered  = filter(None, map(lambda f: f.__name__ if f.__code__.co_argcount > 0 else None, fs))

print(list(fs_filtered ))

附录filter只是为了过滤而做的,不支持对迭代器的项目进行操作。在此示例中,print 完美运行,但最后 .__name__ 再次被忽略

m = list(filter(lambda f: (print(f.__name__), f.__name__)[1] if f.__code__.co_argcount > 0 else None, fs))
# funB
# funC
# [<function funB at 0x7f6337eeddc0>, <function funC at 0x7f6337eede50>]