从任意长的参数列表构建python函数

时间:2017-08-03 14:39:19

标签: python

我试图从单个参数或列表构造一个python lambda函数,并且我不确定用于构建lambda的语法:

def check_classes_filter(*class):
    return lambda x: isinstance(x, class) and isinstance(x, class[1]...)

lambda应该检查x是否是传递给函数的任意数量的类的实例(一个或多个)。

是否有一种通用的方法从python中的任意数量的参数构建函数,可能作为一种理解?

2 个答案:

答案 0 :(得分:3)

您可以使用classes循环遍历all args。

def check_classes_filter(*classes):
    return lambda x: all(isinstance(x, c) for c in classes)

>>> fun = check_classes_filter(str)
>>> fun('hello')
True
>>> fun = check_classes_filter(int, str)
>>> fun('hello')
False

虽然我更喜欢传递list个班级

def check_classes_filter(classes):
    return lambda x: all(isinstance(x, c) for c in classes)

并将该函数调用为

check_classes_filter([int, str])

答案 1 :(得分:2)

如果要检查对象是否是任何列出的类的实例,则无需定义任何内容:

>>> isinstance('test', int)
False
>>> isinstance('test', str)
True
>>> isinstance('test', (int, str))
True

来自isinstance documentation

  

如果classinfo是类型对象的元组(或者递归,则是其他类似对象)   tuples),如果object是任何类型的实例,则返回true。

在您的问题中,您提到if x is an instance of any number of classes that is passed to the function (either one or many),这意味着您应该在布尔逻辑中or而不是and。如果要检查对象是否是每个列出的类的实例,请参阅answer with all