2016-03-23 17 views
1

関数引数としてラムダが取ることができる引数の数を指定する可能性はありますか?例えばPythonは関数引数としてラムダ引数を指定します

:kが標準ラムダない場合

def func(k=lambda x:return x**2): 
    return k 

私は指定することができますが、そのkが正確に一つの引数を取ることになっていますか?

マックス

+0

なぜラムダを引数にしていますか?またあなたの質問にあるものは有効なpythonではありません –

+0

また、十分な引数を指定しないでラムダを呼び出すとエラーになるので、それをキャッチすることができます –

答えて

6

あなたはinspect.getargspecを使用して、このような何かを行うことができます:上記の意志は(それがないべきであるが)のようなもので失敗無残こと

import inspect 
def func (k = lambda x: x ** 2): 
    if not callable(k) or len(inspect.getargspec(k).args) != 1: 
     raise TypeError('k must take exactly one argument.') 
    # Do whatever you want 

注:

func (lambda x, y = 8: x + y) 

を...このケースを処理したい場合は、もう少し複雑なものが必要です。

import inspect 
def func (k = lambda x: x ** 2): 
    if not callable(k): 
     raise TypeError('k must be callable.') 
    argspec = inspect.getfullargspec(k) 
    nargs = len(argspec.args) 
    ndeft = 0 if argspec.defaults is None else len(argspec.defaults) 
    if nargs != ndeft + 1: 
     raise TypeError('k must be callable with one argument.') 
    # Do whatever you want 
+0

ありがとう! –

関連する問題