2

私はこれが有効であることを知っています:

def printValue():
    print 'This is the printValue() method'

def callPrintValue(methodName):
    methodName()
    print 'This is the callPrintValue() method'

しかし、パラメータを別の関数のパラメータとして受け取るメソッドを渡す方法はありますか?

これを行うことはできません:

def printValue(value):
    print 'This is the printValue() method. The value is %s'%(value)

def callPrintValue(methodName):
    methodName()
    print 'This is the callPrintValue() method'

これは私が得るスタックトレースです:

This is the printValue() method. The value is dsdsd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in callPrintValue
TypeError: 'NoneType' object is not callable
4

5 に答える 5

8

醜いと感じる人もいますlambdaが、このような場合に便利なツールです。のシグニチャを変更するのではなく、引数をにバインドする新しい関数をすばやく定義するためにcallPrintValue()使用できます。これを本当に実行したいかどうかは多くの要因に依存し、他の人が示唆しているようにパラメーターを追加することが望ましい場合があります。それでも、これは検討する価値のあるオプションです。以下は、現在のコードを変更せずに機能します。lambdaprintValue()*args

>>> callPrintValue(lambda: printValue('"Hello, I am a value"'))
This is the printValue() method. The value is "Hello, I am a value"
This is the callPrintValue() method
于 2012-07-16T12:59:26.330 に答える
6
def printValue(value):
    print 'This is the printValue() method. The value is %s'%(value)

def callPrintValue(methodName, *args):
    methodName(*args)
    print 'This is the callPrintValue() method'

次に、次のように呼び出すことができます。

callPrintValue(printValue, "Value to pass to printValue")

これにより、任意の数の引数を渡すことができ、それらはすべて、呼び出した関数に渡されますcallPrintValue

于 2012-07-16T12:53:00.947 に答える
4

私はあなたがこれを行うことができると思います


def callPrintValue(methodName, *args):
    methodName(*args)
    print 'This is the callPrintValue() method'

電話をかける


callPrintValue(printValue, "abc")
于 2012-07-16T12:53:55.397 に答える
3

タプルアンパッキングを使用したい:

def print_value(*values):
    print values

def call_print_value(func,args=None):
    func(*args)

call_print_value(print_value,args=('this','works')) #prints ('this', 'works')

API の観点からは、渡される引数を別のキーワードとして保持することを好みます。print_value(次に、どの引数が によって使用され、どの引数が によって使用されているかがもう少し明確になりますcall_print_value)。また、Python では、関数 (およびメソッド) の名前をname_with_underscores. クラス名はキャメルケースが一般的です。

于 2012-07-16T12:54:46.927 に答える
2

既に提供されている回答のフォローアップとして、*args および/または **kwargs および Python での理解を深めるために、stackoverflow に関する次の質問を確認することをお勧めしますlambda

  1. *args と **kwargs とはどういう意味ですか?
  2. ** (二重星) と * (星) は Python パラメータに対して何をしますか?
  3. Python ラムダ - なぜ?
于 2012-07-16T13:02:34.023 に答える