45

(ラムダを含む変数が与えられた場合)ラムダに含まれるパラメーターの数を決定する方法があるかどうか疑問に思っています。その理由は、パラメータの数に応じて条件付きで関数を呼び出したいからです。

私が探しているもの

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

3 に答える 3

60

ラムダは他の関数と同じです。引数の数はに格納され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
于 2012-06-02T19:37:46.783 に答える
45

varargsとkeywordsをどのように考慮したいかわからないので、引数のカウント方法に関する部分はスキップします。しかし、これで始められるはずです。

>>> 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はPython3で非推奨になっているようです(@JeffHeatonに感謝します)。推奨されるソリューションは、inspect.signatureを使用します。結果の.parametersメンバーには、問題の関数へのパラメーターの配置に応じてさまざまな構造が含まれていますが、上記のPython2の例の関数と一致しています。

>>> 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">)]))
于 2012-06-02T19:37:18.887 に答える
10

呼び出し可能な型に関するドキュメントから、関数の属性にはコードオブジェクトが含まれ、コードオブジェクトfunc_codeに関するinspectモジュールのドキュメントから、引数の数(またはargsを含まない)を含むメンバーがあります。co_argcount***

したがって、ラムダ関数(または任意の関数)からこの情報を取得する最良の方法は、次を使用することfunc.func_code.co_argcountです。

>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2
于 2012-06-02T19:46:19.453 に答える