0

PEP 570で指定され、 Python 3.8で導入された位置のみのパラメーターをいじっていますが、特定のコーナーケースについて疑問に思っていました。

次のように関数を定義するとしましょう (それが良い設計であるか、まったく意味があるかどうかに関係なく):

def func(p1, p2=None, p3=None, /): 
    print(p1, p2, p3)

したがって、1 つの必須パラメータ ( ) と、2 つのオプション パラメータ (および)p1が続きます。, andまたはand andだけで関数を呼び出すことができます:p2p3p1p1p2p1p2p3

func(1)       # 1, None, None
func(1, 2)    # 1, 2, None
func(1, 2, 3) # 1, 2, 3

しかし、キーワード引数を指定できないため、デフォルトの for を維持p1しながら、 と の引数で呼び出すことはできません。p3p2

func(1, p3=3)

もちろん、これは を発生させTypeErrorます:

TypeError: func() got some positional-only arguments passed as keyword arguments: 'p3'

PEP 570のすべての例は、位置のみの引数の一部として単一のオプションのパラメーターをカバーしているだけなので、このケースに関する議論や例を見つけることができませんでした:

def name(p1, p2, /, p_or_kw, *, kw):
def name(p1, p2=None, /, p_or_kw=None, *, kw):
def name(p1, p2=None, /, *, kw):
def name(p1, p2=None, /):
def name(p1, p2, /, p_or_kw):
def name(p1, p2, /):

したがって、私の質問は次のとおりです。呼び出し元に複数のオプションの引数を左から右に提供させ、それらを強制的な順序でオーバーライドさせることは、意図された動作ですか? これは実際に位置のみの引数の機能ですか?

4

2 に答える 2

0

呼び出し元に複数のオプションの引数を左から右に提供させ、それらを強制的な順序でオーバーライドさせることは、意図された動作ですか? これは実際に位置のみの引数の機能ですか?

それが位置引数の「意図された動作」であるだけでなく、それはほとんどその定義です。

func(1, p3=3)/は、位置引数のみを受け入れる関数にキーワード引数を提供するため、関数のシグネチャでの使用に直接矛盾します。デフォルト値があるという事実p2は無関係です(ただし、あなたが見つけたようにほとんど役に立ちません)。

ドキュメントで明確な説明を探し続けますが、ないかもしれません。これは基本的に、 を使用することの単純な意味です/

ただしPEP570 には次の例が含まれています

def name(positional_only_parameters, /, positional_or_keyword_parameters,
         *, keyword_only_parameters):

これは、次のように書き直すことができることを示唆してfuncいます。

def func(p1,p3=None, /, p2=None):
    print(p1, p2, p3)

次に、これらの両方が機能します。

func(1, 3)
func(1, 3, 2)

出力は

1 None 3
1 2 3

オンラインで試す

于 2019-10-30T09:12:36.127 に答える