33 votes

Déterminer le nombre de paramètres dans une lambda

Je me demande si il existe un moyen pour déterminer (étant donné une variable contenant un lambda) le nombre de paramètres de la lambda qu'il contient. La raison d'être, je souhaite appeler une fonction conditionnelle dépend du nombre de paramètres.

Ce que je suis à la recherche d'

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
    """

Si je peux faire quelque chose comme

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)

48voto

BrenBarn Points 63718

Les Lambdas sont des fonctions comme les autres. L'argument nombre est stocké dans 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

35voto

robert Points 10493

Je suis à sauter la partie sur la manière de compter les arguments, parce que je ne sais pas comment vous voulez à considérer varargs et mots-clés. Mais cela devrait vous obtenir a commencé.

>>> import inspect
>>> foo = lambda x, y, z: x + y + z
>>> inspect.getargspec(foo)
ArgSpec(args=['x', 'y', 'z'], varargs=None, keywords=None, defaults=None)

10voto

Andrew Clark Points 77748

À partir de la documentation sur appelable types, l' func_code attribut de fonctions contient un code objet, et de les inspecter module de documentation sur le code des objets il y a un co_argcount membre qui contient le nombre d'arguments (non compris l' * ou ** args).

Donc, la meilleure façon d'obtenir cette information à partir d'une fonction lambda (ou toute fonction) est d'utiliser func.func_code.co_argcount:

>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X