2012-06-02 11 views
36

ラムダに含まれるパラメータの数を(ラムダを含む変数で)決定する方法があるのだろうかと思います。理由は、パラメータの数に応じて条件付きで関数を呼びたいからです。ラムダ内のパラメータの数を調べる

私が方法がわからないので、私は、だから私は

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) 

答えて

38

私は引数をカウントする方法についての一部を飛ばしてるような何かを行うことができます

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

を探しています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) 

これは、Python 3(@JeffHeatonのおかげで)のようinspect.getargspec is deprecatedのように聞こえます。お勧めのソリューションは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">)])) 
+1

はinspect.getargspecが廃止されましたように、 – JeffHeaton

50

ラムダは他の機能と同じです。引数の数はfunc.__code__.co_argcountに格納されます。 callable typesのドキュメントから

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

+ inspect.signature使用することが提案されて見えます1大きな答え - 私は2つの答えを受け入れることができれば幸いです。これは実際inspect.pyがどのようにそれを行うか(ソースを調べる)です。 –

+7

しかし、 'inspect'を使うと、属性の名前がPython 2からPython 3にどのように変わったかを見て、"移植可能な "機能が得られます。 –

10

、機能のfunc_code属性は、コードオブジェクトを含み、code objects上の検査モジュールのドキュメントから(*又は**引数を含まない)引数の数が含まco_argcountメンバーがあります。

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

>>> foo = lambda a, b, *args, **kwargs: None 
>>> foo.func_code.co_argcount 
2 
関連する問題