Подтвердить что ты не робот

Определение количества параметров в лямбда

Мне интересно, есть ли способ определить (учитывая переменную, содержащую лямбда) количество параметров, которые она содержит. Причина в том, что я хочу вызвать функцию, которая условно зависит от количества параметров.

Что я ищу

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)
4b9b3361

Ответ 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