0

したがって、名前付き引数を大量に受け取る関数がある場合は、次のようになります。

def foo(a = 1, b = 2, c = 3, d = 4, e = 5) # etc...
    pass

そして、私はそれを定義とまったく同じ名前を持つすべての引数で呼んでいます:

a = 0
b = 0
c = 0
d = 0
e = 0

これを回避する方法はありますか?

foo(e = e, b = b, d = d, a = a, c = c)

そしてこれを行うだけです:

foo(e, b, d, a, c)

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

foo(a, b, c, d, e)

しかし、引数に複雑な名前があり、それらの順序を暗記できない場合はどうなりますか?

4

5 に答える 5

5

さて、あなたは次のようなことをすることができます:

def foo(a, b, c, d):
    print a, b, c, d


d = 4
b = 2
c = 3
a = 1

import inspect
foo(*[locals().get(arg, None) for arg in inspect.getargspec(foo).args])

しかし、これをお勧めできるかどうかはわかりません...実際には、引数の辞書を使用します。

foo_params = {
    'd' : 4,
    'b' : 2,
    'c' : 3,
    'a' : 1
}

foo(**foo_params)

foo引数の使用量が少ないラッパーを作成します。

于 2012-04-05T16:50:28.067 に答える
3

Python の引数受け渡しメカニズムは非常に柔軟です。十分に柔軟でない場合、これは私にはデザインの匂いのように思えます...

  • においの可能性:関数への引数が多すぎます。解決策: 複数の関数に分割し、いくつかの引数を一緒に辞書またはオブジェクトに渡します。

  • 臭いの可能性:変数名が悪い。解決策: 変数にわかりやすい名前を付けます。

または、弾丸を噛んで正しい順序を見つけ出し、シンプルに保ちます。

于 2012-04-05T16:53:38.507 に答える
3

関数を変更することはできなくても、渡されたパラメーターに値を割り当てる方法を自由に変更できる場合は、次のコード例を参考にしてください。これは orderdict を使用して

与えられた

>>> def foo(a = 1, b = 2, c = 3, d = 4, e = 5):
    print "a={0},b={1},c={2},d={3},e={4}".format(a,b,c,d,e)

あなたができること

>>> var=dict()
>>> var['c']=12
>>> var['a']=10
>>> var['b']=11
>>> var['e']=14
>>> foo(**var)
a=10,b=11,c=12,d=4,e=14

この回答は@ thg435によって提案されたものと似ていますが、あなたは

  1. 関数が期待する引数をハックするために検査を使用しない。
  2. ローカル/グローバル ディクショナリを調べていません。
  3. デフォルトの引数にデフォルト設定される欠落している引数をサポートします。
  4. もちろん、順序を覚える必要はありません。
  5. また、変数をパラメーターとして渡す必要さえありません。辞書を渡すだけです。
于 2012-04-05T17:12:03.907 に答える
0

次のことができます。

def func(a=1, b=2, c=3, **kw):
    print a,b,c

a = 11
b = 22
c = 33

func(**locals())
于 2012-04-05T16:51:23.057 に答える
0

Calling a 5-argument function with a completely different set of arguments each time is pretty rare. If, in practice, you're using the same a, c, and e args most of the time and calling with different b and d args (for example), you can create a class to help you with this:

class FooWrapper(object):
    def __init__( self, commonA, commonC, commonE ):
        self.a = commonA
        self.c = commonC
        self.e = commonE

    def invokeFoo( self, _b, _d ):
        foo( a=self.a, b = _b, c = self.c, d = _d, e = self.e )

w = FooWrapper( 1, 2, 3 )
w.invokeFoo( 4, 5 )          # calls foo( 1, 4, 2, 5, 3 )
w.invokeFoo( 6, 7 )          # calls foo( 1, 6, 2, 7, 3 )
于 2012-04-05T18:00:55.270 に答える