Как выяснить, какие именованные аргументы функции есть в python - PullRequest
0 голосов
/ 06 февраля 2020

Я пишу функцию, которая в качестве одного из аргументов примет словарь функций для применения. У всех этих функций будет по крайней мере один общий аргумент, но у некоторых будут другие. Не теряя гибкости, позволяя пользователю определять произвольные функции (при условии, что их аргументы находятся в области видимости), как я могу проанализировать функцию, чтобы увидеть ее аргументы?

Вот фиктивный пример:

def f1(x, y):
    return x+y

def f2(x):
    return x**2

fundict = dict(f1 = f1,
               f2 = f2)

y = 3 # this will always be defined in the same scope as fundict

for i in list(fundict.keys()):
    if <the args to the function have y in them>:
        fundict[i](x, y)
    else:
        fundict[i](x)

Еще лучше было бы то, что программно смотрит на определение функции и передает ей массив аргументов, при условии, что они находятся в области видимости. ,

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

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Вы можете использовать inspect.getfullargspe c

import inspect

def f1(x, y):
    return x+y

def f2(x):
    return x**2

fundict = dict(f1 = f1,
               f2 = f2)

y = 3 # this will always be defined in the same scope as fundict

x = 1

for i in list(fundict.keys()):
    if 'y' in inspect.getfullargspec(fundict[i]).args:
        print(fundict[i](x, y))
    else:
        print(fundict[i](x))

Это дает:

4
1
2 голосов
/ 06 февраля 2020

Вы можете использовать inspect.getfullargspe c.
Пример:

>>> for k, fun in fundict.items():
...     print(fun.__name__, inspect.getfullargspec(fun)[0])
... 
f1 ['x', 'y']
f2 ['x']
...