help()の出力でのスラッシュの意味は何ですか?


148

閉じ括弧の前/のPython 3.4のhelp出力の意味は何rangeですか?

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...

回答:


185

それはの終わりを意味し、位置のみのパラメータを、パラメータは、あなたがすることはできませんキーワードのパラメーターとして使用します。Python 3.8より前は、そのようなパラメーターはC APIでのみ指定できました。

これは、へのkey引数が__contains__位置(range(5).__contains__(3))によってのみ渡され、キーワード引数(range(5).__contains__(key=3))として渡されないことを意味します。これは、純粋なPython関数の位置引数で実行できるものです。

Argument Clinicのドキュメントもご覧ください。

Argument Clinicですべてのパラメーターを位置指定のみとしてマークする/には、最後のパラメーターの後に、パラメーター行と同じようにインデントされた行自体にaを追加します。

と(最近追加された)Python FAQ

関数の引数リストのスラッシュは、その前のパラメーターが位置のみであることを示します。位置のみのパラメーターは、外部で使用可能な名前のないパラメーターです。位置のみのパラメーターを受け入れる関数を呼び出すと、引数はその位置のみに基づいてパラメーターにマップされます。

構文はPython言語仕様の一部になりました。バージョン3.8以降、PEP 570 – Python Positional-Only Parametersを参照してください。PEP 570より前の構文は、Pythonに将来含まれる可能性があるために予約されていました。PEP457- 位置のみのパラメーターの構文を参照してください。

位置のみのパラメーターは、より明確で明確なAPIにつながり、それ以外の場合はCのみのモジュールの純粋なPython実装をより一貫性があり、維持しやすくします。位置のみのパラメーターはほとんど処理を必要としないため、より高速なPythonコードにつながります。


21

私自身もこの質問をしました。:) /もともとここでグイドによって提案されたことがわかりまし

代替案:「/」の使用はどうですか?これは、「キーワード引数」を意味する「*」とは正反対であり、「/」は新しい文字ではありません。

それから彼の提案は勝った

へえ。それが本当なら、私の「/」提案が勝ちます。

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

これをカバーする非常に関連性の高いドキュメントはPEP 570だと思います。要約セクションは見栄えが良い場所。

要約

ユースケースによって、関数定義で使用するパラメーターが決まります。

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

ガイダンスとして:

名前が重要でない、または意味がなく、常に同じ順序で渡される引数が数個しかない場合は、位置のみを使用します。名前に意味があり、名前で明示することで関数定義がより理解しやすい場合は、キーワードのみを使用します。


関数が次で終わる場合 /

def foo(p1, p2, /)

これは、すべての関数引数が定位置であることを意味します。


6
/トークンを選択すると、「の逆演算*」が示されているため、Pythonは少し狂っています。それは一種の共感覚です。
Tomasz Gandor

6

スラッシュ(/)は、それより前のすべての引数が位置のみの引数であることを示します。位置のみの引数機能は、PEP 570が受け入れられた後にPython 3.8で追加されました。最初、この表記はPEP 457で定義されました-位置のみのパラメーターの表記の表記

前方スラッシュ(/)より前の関数定義のパラメーターは位置のみであり、スラッシュ(/)が後に続くパラメーターは、構文に従って任意の種類にすることができます。引数が、関数の呼び出し時の位置のみに基づいて、位置のみのパラメーターにマップされる場合。keyword(name)による位置のみのパラメーターの受け渡しは無効です。

次の例を見てみましょう

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

ここで、上記の関数定義のパラメーターaおよびbは位置のみですが、xまたはyは位置またはキーワードのいずれかです。

以下の関数呼び出しが有効です

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

ただし、次の関数呼び出しは無効であり、a、bは位置引数として渡されず、キーワードとして渡されるため、例外TypeErrorが発生します。

foo(a=1.45, b=3.14, x=1, y=4)

TypeError:foo()は、キーワード引数として渡される位置のみの引数を受け取りました: 'a、b'

Pythonの多くの組み込み関数は、位置指定のみの引数を受け入れますが、キーワードで引数を渡しても意味がありません。たとえば、組み込み関数lenは、1つの位置(のみ)引数のみを受け入れます。len(obj = "hello world")としてlenを呼び出すと、読みやすさが低下します。help(len)を確認してください。

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

位置のみのパラメーターは、基礎となるc /ライブラリー関数の保守を容易にします。APIを使用するクライアントコードを壊すリスクなしに、位置のみのパラメーターのパラメーター名を将来変更できるようにします。

最後に重要なことですが、位置のみのパラメーターを使用すると、可変長のキーワード引数でその名前を使用できます。次の例を確認してください

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

位置のみのパラメーターの方が適切です。Python の関数引数のタイプ:位置のみのパラメーターで説明されています

位置のみのパラメータ構文が正式にpython3.8に追加されました。新機能python3.8のチェックアウト-位置のみの引数

PEP関連:PEP 570-Python位置のみのパラメーター

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.