1

我有一堂课。此类具有要由不同程序评估的函数列表。

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 是一个检查 number 是否大于 10 的函数。

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

<some_library.check_number object at 0x07B35B90>

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

SomeClassInstance.functions_to_evaluate[0].python_feature() 将返回“5”或 check_number 的输入对我来说是什么。

4

4 回答 4

4

您可以使用标准库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实例,而是可调用的,从鸭子类型的角度来看,它是一个函数。

于 2018-10-17T16:42:17.497 回答
1

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

您可以简单地在列表中tuple添加一个:function, args

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

然后你可以:

for f, args in SomeClassInstance.functions_to_evaluate:
    print(args)
于 2018-10-17T16:43:27.230 回答
1

如果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

于 2018-10-17T16:29:52.040 回答
1

我理解你的困惑,但是:

new_function = check_number(5)

正在调用函数,并且new_function变量被分配了函数的返回值

如果你有这个check_number功能:

def check_number(input):
    return input > 10

然后它会回来False,而且new_functionFalse。从不<some_library.check_number object at 0x07B35B90>

如果你得到了,<some_library.check_number object at 0x07B35B90> 那么你的check_number()函数正在返回其他东西。

于 2018-10-17T16:30:56.743 回答