Получить значение аргументов функции по указателю на эту функцию? - PullRequest
0 голосов
/ 17 ноября 2018

Я бы хотел получить значение аргументов функции по указателю на эту функцию.

def cons(a, b):
    def pair(f):
        return f(a, b)
    return pair

def car(cons):
    # local_a = cons.a
    # return local_a
    pass

if __name__ == '__main__':
    assert car(cons(3, 4)) == 3

Ответы [ 3 ]

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

Создать подпись для функции легко с помощью функции подписи: из проверки импортируемой подписи

def someMethod(self, arg1, kwarg1=None):
    pass

sig = signature(someMethod)

Теперь вы можете быстро просмотреть ее параметры, введя строку:

str(sig)  # returns: '(self, arg1, kwarg1=None)'

или вы также можете получить сопоставление имен атрибутов с объектами параметров через sig.parameters.

params = sig.parameters 
print(params['kwarg1']) # prints: kwarg1=20

Кроме того, вы можете вызвать len для sig.parameters, чтобы также увидеть количество аргументов, необходимых для этой функции:

print(len(params))  # 3

Каждая запись в отображении параметров на самом деле является объектом Parameterэто имеет дополнительные атрибуты, делающие вашу жизнь проще.Например, захват параметра и просмотр его значения по умолчанию теперь легко выполняется с помощью:

kwarg1 = params['kwarg1']
kwarg1.default # returns: None

аналогично для остальных объектов, содержащихся в параметрах.

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

Вы на неправильном пути.Глядя на код в новой версии вашего вопроса, вы пытаетесь извлечь первый элемент церковной пары .

cons(3, 4) для функции, которая при передаче другойфункция f, возвращает f(3, 4).Чтобы извлечь 3, вы должны передать ему функцию, которая принимает два аргумента и возвращает свой первый аргумент:

def car(pair):
    def firstarg(x, y):
        return x
    return pair(firstarg)

Затем car(cons(3, 4)) вызывает cons(3, 4)(firstarg), что вызывает firstarg(3, 4), что возвращает 3.

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

По вашему коду, единственный способ получить эти значения - сделать их похожими на аргументы ключевых слов, чтобы они имели значение по умолчанию.

def foo(a=3, b=4):
    return 'test'

if __name__ == '__main__':
    p = foo         # pointer to function
    print(type(p))  # function
    print(p.__defaults__)  # Returns (3, 4)
    # local_a = p.a       or p[0]
    # local_b = p.b       or p[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...