1

次のような関数があるとします。

def example(var1=None,var2=None,var3=None,*multi_values):
    print (var1,var2,var3,*multi_values)

すべてのオプションのパラメーターを呼び出して、最後のパラメーターに追加するだけで回避できますか?

例:

>>> multi=range(3)
>>> example(???)
(None,"hi",None,(1,2,3))

私はこれをしたくありません:

>>> multi=range(3)
>>> example(None,None,None,*multi) #bad -> this doesn't use the default values
4

2 に答える 2

6

multi_values1 つのオプションは、任意の数のパラメーターを受け入れる代わりに、プロトタイプを引数として iterable を取るように変更することです。

def example(var1=None, var2=None, var3=None, multi_values=None):
    if multi_values is None:
        multi_values = []
    # whatever

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

example(multi_values=multi)

var1別のオプションは、スルーvar3をキーワード引数としてのみ受け入れることです。

def example(*multi_values, **kwargs):
    var1 = kwargs.pop("var1", None)
    var2 = kwargs.pop("var2", None)
    var3 = kwargs.pop("var3", None)
    if kwargs:
        raise TypeError("Unknown keyword arguments")
    # whatever

Python 3.x では、これは引数のvar1スルーを追加することでサポートされています。var3 *multi_values

def example(*multi_values, var1=None, var2=None, var3=None):
    # whatever

これは基本的に前の例と同じですが、イントロスペクションが向上するという利点があります。

于 2012-08-13T18:01:07.920 に答える
3

いいえ。*args 値の前にすべての名前付き値を指定する必要があります。

ただし、 **kwargs を使用して、追加の名前付きパラメーターを取得できます。

def example(var1=None,var2=None,var3=None,**kwargs):

example(var4="something")
于 2012-08-13T18:00:16.720 に答える