Определение количества параметров в лямбда
Мне интересно, есть ли способ определить (учитывая переменную, содержащую лямбда) количество параметров, которые она содержит. Причина в том, что я хочу вызвать функцию, которая условно зависит от количества параметров.
Что я ищу
def magic_lambda_parameter_counting_function(lambda_function):
"""Returns the number of parameters in lambda_function
Args:
lambda_function - A lambda of unknown number of parameters
"""
Итак, я могу сделать что-то вроде
def my_method(lambda_function):
# ...
# (say I have variables i and element)
parameter_count = magic_lambda_parameter_counting_function(lambda_function)
if parameter_count == 1:
lambda_function(i)
elif parameter_count == 2:
lambda_function(i, element)
Ответы
Ответ 1
Я пропускаю часть о том, как считать аргументы, потому что я не знаю, как вы хотите рассмотреть varargs и ключевые слова. Но это должно заставить вас начать.
>>> import inspect
>>> foo = lambda x, y, z: x + y + z
>>> inspect.getargspec(foo)
ArgSpec(args=['x', 'y', 'z'], varargs=None, keywords=None, defaults=None)
Похоже, что проверяет, нет ли проверки .getargspec с Python 3 (благодаря @JeffHeaton). Рекомендуемое решение использует inspect.signature. Элемент .parameters
результата содержит множество структур в зависимости от расположения параметров к рассматриваемой функции, но я сопоставляю свою функцию с приведенным выше примером Python 2.
>>> import inspect
>>> foo = lambda x, y, z: x + y + z
>>> inspect.signature(foo).parameters
mappingproxy(OrderedDict([('x', <Parameter "x">), ('y', <Parameter "y">), ('z', <Parameter "z">)]))
Ответ 2
Lambdas - это функции, подобные любым другим. Счетчик аргументов хранится в func.__code__.co_argcount
.
>>> foo = lambda x, y=2: x+y
>>> foo.__code__.co_argcount
2
>>> foo = lambda x, y=2, z=3: x+y+z
>>> foo.__code__.co_argcount
3
Ответ 3
Из документации вызываемых типов атрибут func_code
функций содержит объект кода и из документации модуля проверки на объектов кода есть член co_argcount
, который содержит количество аргументов (не включая *
или **
args).
Таким образом, лучший способ получить эту информацию от лямбда-функции (или любой функции) - использовать func.func_code.co_argcount
:
>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2