【问题标题】:building a python function from an arbitrarily long list of parameters从任意长的参数列表构建 python 函数
【发布时间】:2017-08-03 22:50:05
【问题描述】:

我正在尝试从单个参数或列表构造一个 python lambda 函数,但不确定使用什么语法来构建 lambda:

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

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

有没有一种通用的方法可以从 python 中的任意数量的参数构建函数,也许是一种理解?

【问题讨论】:

  • 为什么要为此创建一个 lambda 函数,而不是一个可以处理任意长对象列表的实际函数?
  • 嗯,它确实是一个更大的函数的一部分,需要将 lambda 函数作为参数传递给另一个函数,我不想更改接受 lambda 的函数的源代码。

标签: python


【解决方案1】:

您可以使用 all 循环您的 classes 参数。

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])

【讨论】:

    【解决方案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

    【讨论】:

    • 我想使用and 而不是or,否则我只会使用内置功能。不过感谢您的回复,我应该说得更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多