从 python 对象获取函数的输入

Getting inputs to a function from a python object

我有一个class。这个 class 有一个函数列表,要由不同的程序计算。

class SomeClass(object):
    def __init__(self, context):
        self.functions_to_evaluate = []

有一个函数可以通过类似的方式将函数添加到 SomeClass 的实例中:

new_function = check_number(5)
SomeClassInstance.functions_to_evaluate.append(new_function)

其中 check_number 是一个函数,它将检查数字是否大于 10,比方说。

如果我使用 SomeClassInstance.functions_to_evaluate 并打印它,我会得到一堆 python 对象,如下所示:

<some_library.check_number object at 0x07B35B90>

我想知道我是否可以提取给 check_number 的输入,例如:

SomeClassInstance.functions_to_evaluate[0].python_feature() 将 return“5”或 check_number 对我的任何输入。

如果 new_function = check_number(5) 是闭包,那么您可以使用 __closure__[0].cell_contents:

提取该值

示例:

def foo(x):
    def inn(y):
        return x
    return inn

s = foo(5)
print(s.__closure__[0].cell_contents)

输出:

5

我理解你的困惑,但是:

new_function = check_number(5)

正在调用该函数,new_function 变量被赋予函数的 return 值

如果你有这个check_number函数:

def check_number(input):
    return input > 10

则returnFalsenew_functionFalse。从不 <some_library.check_number object at 0x07B35B90>.

如果你得到 <some_library.check_number object at 0x07B35B90> 那么你的 check_number() 函数是 return 其他东西。

您可以使用标准库 functools.partial,它会创建一个新的偏应用函数 *.

>>> from functools import partial
>>> def check_number(input):
...     return input > 10
>>> fn = partial(check_number, 5)
>>> fn.args  # this attribute gives you back the bound arguments, as a tuple.
(5,)
>>> fn()  # calls the function with the bound arguments.
False

*:实际上 partial 对象不是 function 实例,但它是一个可调用对象,从 duck 类型的角度来看它是一个函数。

可能有几种方法可以给这只猫剥皮。但我会首先观察到您没有将 python 函数对象 添加到 functions_to_evaluate 列表中,而是添加了评估 个函数。

您可以简单地将 function, args 中的 tuple 添加到列表中:

SomeClassInstace.functions_to_evaluate.append((check_number, 5))

然后你可以:

for f, args in SomeClassInstance.functions_to_evaluate:
    print(args)