Получение входных данных для функции из объекта Python - PullRequest
0 голосов
/ 17 октября 2018

У меня есть класс.Этот класс имеет список функций, которые должны оцениваться другой программой.

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 (), который будет возвращать "5" или что угодно, что было введено для меня в check_number.

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

Существует несколько способов снять шкуру с этой кошки.Но прежде всего я бы заметил, что вы не добавляете объекты функций 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)
0 голосов
/ 17 октября 2018

Я понимаю вашу путаницу, но:

new_function = check_number(5)

вызывает функцию, а переменной new_function присваивается возвращаемое значение функции.

Если у вас есть эта check_number функция:

def check_number(input):
    return input > 10

Тогда она вернет False, и new_function будет False.Никогда <some_library.check_number object at 0x07B35B90>.

Если вы получаете <some_library.check_number object at 0x07B35B90>, тогда ваша функция check_number() возвращает что-то еще.

0 голосов
/ 17 октября 2018

Вы можете использовать стандартную библиотеку 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 экземпляр, но он вызывается, и с точки зрения типа утки это функция.

0 голосов
/ 17 октября 2018

Если 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

...