13

条件付きでPython関数に任意の数の名前付きデフォルト引数を渡すことは可能ですか?

たとえば。関数があります:

def func(arg, arg2='', arg3='def')

ロジックは、arg3 を渡す必要があるかどうかを判断する条件があるということです。次のように実行できます。

if condition == True:
    func('arg', arg2='arg2', arg3='some value')
else:
    func('arg', arg2='arg2')

質問は、次のような省略表現を使用できますか?

func('arg', 'arg2', 'some value' if condition == True else # nothing so default gets picked
)
4

4 に答える 4

10

私が考えることができる唯一の方法は

func("arg", "arg2", **({"arg3": "some value"} if condition == True else {}))

また

func("arg", "arg2", *(("some value",) if condition == True else ()))

しかし、これをしないでください。自分で提供したコード、または次のようなコードを使用します。

if condition:
   arg3 = "some value",
else:
   arg3 = ()
func("arg", "arg2", *arg3)
于 2011-01-12T15:42:51.143 に答える
9

それは有効な Python 構文ではありませんelse。通常行われることは次のとおりです。

func('arg', 'arg2', 'some value' if condition else None)

それに応じて関数定義が変更されます。

def func(arg, arg2='', arg3=None):
    arg3 = 'def' if arg3 is None else arg3
于 2011-01-12T15:44:16.487 に答える
4

多くのデフォルト引数を持つ関数がある場合

def lots_of_defaults(arg1 = "foo", arg2 = "bar", arg3 = "baz", arg4 = "blah"):
    pass

プログラムで実行中の何かに基づいて、これらのいくつかに異なる値を渡したい場合、簡単な方法は**、プログラム ロジックに基づいて作成した引数名と値のディクショナリを展開することです。

different_than_defaults = {}
if foobar:
    different_than_defaults["arg1"] = "baaaz"
if barblah:
    different_than_defaults["arg4"] = "bleck"

lots_of_defaults(**different_than_defaults)

これには、呼び出しに何が入るかを決定するロジックが多数ある場合に、関数を呼び出す時点でコードが詰まらないという利点があります。デフォルトを持たない引数がある場合は、ディクショナリを渡す前に渡す値を含めるように注意する必要があります。

于 2011-01-12T17:48:00.050 に答える
0

ヘルパー関数を書くことができます

def caller(func, *args, **kwargs):
    return func(*args, **{k:v for k,v in kwargs.items() if v != caller.DONT_PASS})
caller.DONT_PASS = object()

この関数を使用して別の関数を呼び出しcaller.DONT_PASS、渡したくない引数を指定するために使用します。

caller(func, 'arg', 'arg2', arg3 = 'some value' if condition else caller.DONT_PASS)

caller()これは、条件付きでキーワード引数を渡すことのみをサポートすることに注意してください。inspect位置引数をサポートするには、モジュールを使用して関数を検査する必要がある場合があります。

于 2015-02-02T11:25:38.550 に答える