2017-05-11 30 views
0

Pythonの関数にパラメータのデフォルト値を使用するように明示的に指示することはできますか?例えばPython関数の名前付き引数のデフォルト値の使い方を明示的に示す方法は?

、関数は次のように定義されている場合:

def foo(a=1, b=2, c=3): 
    pass 

Iのような関数呼び出したい:

foo(a=3, c=10) 

:と同等であるべきである

foo(a=3, b=<USE-DEFAULT>, c=10) 
       ^
       | 

を1つの使用例は、関数がクラスのインスタンスをインスタンス化するために使用される場合です:

class foo(): 
    def __init__(a=1, b=2, c=3): 
     self.a = a 
     self.b = b 
     self.c = c 

def create_foo(a=None, b=None, c=None): 
    f = foo(<PASS ALL EXCEPT NONE>) 

F = create_foo(a=10, c=30) 
# Then F should have a=10, b=2, c=30 

この例では、デフォルト値を複数回定義することを避けたいと思います。

+2

なぜこれをしたいですか? – mohammad

+6

単に無視すると、デフォルト値が使用されます。 – mohammad

+1

値を渡さないと、自動的に 'default'値 –

答えて

3

ただ、代わりに

foo(a=3, c=10) 

としての機能は、あなたが例えばある以下のアプローチを使用することができることを呼び出しますデフォルト値はモジュールスコープで評価されるので、リストのために必要な:Noneは有効な選択肢でない場合

def foo(a=None, b=None, c=None): 
    local_a = a or "default" 
    ... 

foo(a=42, b=None, c=16) 

Noneはその後、デフォルトを使用して符号化します。

最後に、あなただけの「定数」としてデフォルトを定義した可能性:

DEFAULT_A = 42 
DEFAULT_B = "foo" 
DEFAULT_C = 17 

def foo(a=DEFAULT_A, b=DEFAULT_B, c=DEFAULT_C): 
    pass 

foo(16, DEFAULT_B, 123) 

しかし、これは非常にまれです。

あなた更新たとえば、私は***演算子を使用することを提案します:

def create_foo(*args, **kwargs): 
    f = foo(*args, **kwargs) 

create_foo(42, b="non-default") 

の説明どのようにこれらの演算子の仕事のためにthis questionを参照してください。

+0

これは「明示的にデフォルト値の使用を示していません」 – Sayse

+0

関数は常にすべてのパラメーターを評価する必要があるため、デフォルトを使用する必要があります。他の言語はありません。内部的なやり方です。 – languitar

+0

括弧も間違っています;)@Sayse:なぜあなたは再びデフォルト値を言及したいのですか?もしそうなら、あなたは同じものを書く必要があります...例えばb = 2ですが、上記のように意味がありません –

0

definingの機能がある場合は、デフォルト値を設定することができます。callの場合、デフォルトの引数を関数に渡す必要はありません。

>>> def foo(a=1, b=2, c=3): 
...  print('a: {0}, b: {1}, c: {2}'.format(a, b, c)) 
... 
>>> foo(a=3, c=10) 
a: 3, b: 2, c: 10 
>>> foo() 
a: 1, b: 2, c: 3 
>>> foo(a=3) 
a: 3, b: 2, c: 3 
>>> foo(a=3, c=10, b=5) 
a: 3, b: 5, c: 10 
>>> 
2

あなたは*引数とを使用しない場合*:上記の機能foo

def foo(a=1, b=<USE-DEFAULT>, c=3): 
    print(b) 

foo(a=3, c=10) 

は、あなたが実際に

例C、すべての引数、bについてdefault値を設定しています* kwargsとサブクラス化すると、デフォルトを明示的に呼び出す必要はなく、独自のクラスだけを使用していて相互のデフォルト引数を必要としない限り、デフォルトと同じ値を渡すことができます。 * argsと** kwargsで作業する呼び出されるメソッドがスーパークラスからのものである場合、MROに問題が発生する可能性があります。

私が知っている唯一の方法は、(この時点で不明な)スーパークラスがあなたのクラスが拡張するクラスに引数を渡すのを防ぐために、メソッドを明示的に呼び出すことです。あなたが手に入れたい引数だけを渡してください。
私は明示的なデフォルト呼び出しのための別のユースケースを見ません。

+0

このアドバイスに従うと、 'super 'としてあなたを呼び出すサブクラスが問題を引き起こすかもしれないことに注意してください。 MROはPythonでは扱いにくいもので、すべてのクラスのすべての場所でsuperを使用するか、決して使用しないでください。 – hajef

関連する問題