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

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

Что я ищу

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) 

3 Solutions collect form web for “Определение количества параметров в лямбда”

Я пропускаю часть о том, как считать аргументы, потому что я не знаю, как вы хотите рассматривать 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) 

Похоже, что inspect.getargspec устарел от Python 3 (благодаря @JeffHeaton). Рекомендуемое решение использует проверочную подпись . Элемент .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">)])) 

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 

Из документации по вызываемым типам атрибут func_code функций содержит объект кода, а из документации модуля проверки объектов кода есть член co_argcount который содержит количество аргументов (не включая * или ** args).

Таким образом, лучший способ получить эту информацию от лямбда-функции (или любой функции) – использовать func.func_code.co_argcount :

 >>> foo = lambda a, b, *args, **kwargs: None >>> foo.func_code.co_argcount 2 
  • Python & Tkinter - команда кнопок для установки тега labelvariable
  • аргументы с распаковкой лямбда
  • Преобразование чисел в классы в списке python
  • Необязательный аргумент в лямбда-функции
  • Странное поведение: понимание Lambda внутри списка
  • Трудность понимания лямбда-функции в сортировке
  • Сжатие вызова участника «n» -time
  • Использование декораторов на лямбдах в Python?
  • Поиск среднего списка
  • Лямбда Python без переменных?
  • Python lambdas и область охвата
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.