0
def test(name):
    print "name:", name

func = test
func("testing") # it works, as I know that the function test accepts one parameter.

私の質問は、「test」がシナリオに応じてさまざまな数の引数を持ち、「func」が渡す引数の数とそれらの引数の名前をどのように知っているかです。

よくわからない場合は申し訳ありません。これにより、シナリオがより明確になります。

関数ディスパッチャがあります。

testcase_obj  = testcase() # A object of a class    
if command.startswith("test1"):    
    output = exec_test1()    
elif command.startswith("do_test"):    
    output = exec_do_test(testcase_obj)

ここで、スクリプトの実行中にユーザーがオプションを送信するたびに関数をラップしたいと考えています。上記のコードを次のように変更しました。

testcase_obj  = testcase() # A object of a class    
if command.startswith("test1"):    
    func = exec_test1() # Mistake, this should be func = exec_test1
elif command.startswith("do_test"):    
    func = exec_do_test(testcase_obj) # I don't know how assign exec_do_test along
                                      # with its parameter to 'func'. I don't want to
                                      # to call exec_to_test.

if option_given:    
    func = wrapper_func(func)    
    output = func() # At this point I don't how many parameters that "func" takes.
4

5 に答える 5

5

と言った後func = test、はの単なる別名funcになります。したがって、とまったく同じ方法で呼び出します。間違った数の引数を指定すると、間違って呼び出した場合と同じようになります。testfunctestfuncTypeErrortest

他の言語の変数とPythonの名前の違いの詳細については、Pythonistaのようなコードを参照してください。

于 2012-10-23T06:19:32.253 に答える
3

inspectモジュールを試す

import inspect
inspect.getargspec(func).args

あげる:

['name']
于 2012-10-23T06:32:59.227 に答える
1

同じになります。

funcはテストの単なるエイリアスであり、テストを呼び出す関数ではありません

于 2012-10-23T06:19:36.533 に答える
1

「test」が可変数の引数を取り、「func」に割り当てられている場合。「func」の引数がいくつあるか知りたいです。Introspection(dir(func)) は、「func」が取ることができる引数の数を示しません。

func関数ではありません。これは、呼び出される関数を指す単なるエイリアスtestです。したがって、 は関数ではなく、1 を指す名前にすぎないためfunc、異なる数の引数を取る方法はありません。これを確認できます。testfunc

>>> def test(arg1):
...    print 'test was given ',arg1
...
>>> func = test
>>> test.func_name
'test'
>>> func.func_name
'test'
>>> id(func)
3075004876L
>>> id(test)
3075004876L
>>> inspect.getargspec(func).args
['arg1']
>>> inspect.getargspec(test).args
['arg1']
于 2012-10-23T07:02:13.233 に答える
0

はい、関数にデフォルト値を与える方法があります。

def test(name="default",hi=0):
    print "name:", name,hi

func = test
func("testing")
func("testing",6) 
func(0)
于 2012-10-23T06:39:20.160 に答える