21

Pythonでは機能しない次の関数について考えてみますが、これを使用して、何をする必要があるかを説明します。

def exampleFunction(a, b, c = a):
    ...function body...

つまり、代替値が指定されていない限り、変数が取るcのと同じ値を変数に割り当てたいのです。a上記のコードはPythonでは機能しません。これを行う方法はありますか?

4

3 に答える 3

30
def example(a, b, c=None):
    if c is None:
        c = a
    ...

キーワード引数のデフォルト値を変数にすることはできません(変数の場合、関数の定義時に固定値に変換されます)。通常、メイン関数に引数を渡すために使用されます。

def main(argv=None):
    if argv is None:
        argv = sys.argv

None有効な値である可能性がある場合、解決策は、carlの回答のように/ magicを使用するか、センチネル*argsオブジェクト使用することです。これを行うライブラリには、attrsMarshmallowが含まれ、私の意見では、はるかにクリーンで、おそらく高速です。**kwargs

missing = object()

def example(a, b, c=missing):
    if c is missing:
        c = a
    ...

真になるための唯一の方法は、そこで作成ダミーオブジェクトであるということです。c is missingc

于 2010-08-20T19:51:53.777 に答える
17

この一般的なパターンは、おそらく最良で最も読みやすいものです。

def exampleFunction(a, b, c = None):
    if c is None:
        c = a
    ...

Noneの有効な状態ではないことに注意する必要がありますc

'None'値をサポートする場合は、次のようにすることができます。

def example(a, b, *args, **kwargs):
    if 'c' in kwargs:
        c = kwargs['c']
    elif len(args) > 0:
        c = args[0]
    else:
        c = a
于 2010-08-20T19:52:55.357 に答える
1

1つのアプローチは次のようなものです。

def foo(a, b, c=None):
    c = a if c is None else c
    # do something
于 2010-08-20T19:52:36.120 に答える