Apa arti garis miring dalam bantuan ()?

148

Apa /artinya dalam helpoutput Python 3.4 rangesebelum tanda kurung tutup?

>>> 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.

                                        ...
Joschua
sumber

Jawaban:

185

Ini menandakan akhir dari hanya parameter posisi , parameter yang tidak dapat Anda gunakan sebagai parameter kata kunci. Sebelum Python 3.8, parameter seperti itu hanya dapat ditentukan dalam C API.

Ini berarti keyargumen __contains__hanya dapat diteruskan oleh posisi ( range(5).__contains__(3)), bukan sebagai argumen kata kunci ( range(5).__contains__(key=3)), sesuatu yang dapat Anda lakukan dengan argumen posisional dalam fungsi pure-python.

Lihat juga dokumentasi Klinik Argument :

Untuk menandai semua parameter sebagai posisi saja di Klinik Argument, tambahkan /satu baris dengan sendirinya setelah parameter terakhir, indentasi sama dengan baris parameter.

dan (tambahan terbaru untuk) FAQ Python :

Garis miring dalam daftar argumen fungsi menunjukkan bahwa parameter sebelum itu hanya posisional. Parameter hanya posisi adalah yang tanpa nama yang dapat digunakan secara eksternal. Saat memanggil fungsi yang menerima parameter hanya posisi, argumen dipetakan ke parameter hanya berdasarkan posisi mereka.

Sintaksis sekarang menjadi bagian dari spesifikasi bahasa Python, pada versi 3.8 , lihat PEP 570 - Parameter Hanya-Posisi Python . Sebelum PEP 570, sintaks sudah disediakan untuk kemungkinan penyertaan di masa depan dalam Python, lihat PEP 457 - Sintaks Untuk Parameter Hanya-Posisi .

Parameter hanya-posisi dapat mengarah ke API yang lebih bersih dan lebih jelas, membuat implementasi Python murni dari modul C-only lebih konsisten dan lebih mudah untuk dipelihara, dan karena parameter hanya-posisi memerlukan proses yang sangat sedikit, mereka menyebabkan kode Python lebih cepat.

Martijn Pieters
sumber
22

Saya mengajukan pertanyaan ini sendiri. :) Mengetahui yang /awalnya diusulkan oleh Guido di sini .

Proposal alternatif: bagaimana kalau menggunakan '/'? Ini semacam kebalikan dari '*' yang berarti "argumen kata kunci", dan '/' bukan karakter baru.

Kemudian proposalnya menang .

Heh. Jika itu benar, proposal '/' saya menang:

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

Saya pikir dokumen yang sangat relevan yang meliput ini adalah PEP 570 . Di mana bagian rekap terlihat bagus.

Rekap

Case use akan menentukan parameter mana yang digunakan dalam definisi fungsi:

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

Sebagai pedoman:

Gunakan posisi-hanya jika nama tidak penting atau tidak memiliki arti, dan hanya ada beberapa argumen yang akan selalu dilewati dalam urutan yang sama. Gunakan hanya kata kunci ketika nama memiliki makna dan definisi fungsi lebih mudah dipahami dengan secara eksplisit menggunakan nama.


Jika fungsi berakhir dengan /

def foo(p1, p2, /)

Ini berarti semua argumen fungsional bersifat posisional.

prosti
sumber
6
Memilih /token, karena "ini adalah operasi terbalik *" menunjukkan, bahwa Python hanya sedikit gila. Ini semacam sinestesia.
Tomasz Gandor
6

Forward Slash (/) menunjukkan semua argumen sebelumnya hanya argumen posisional. Fitur argumen hanya posisional ditambahkan dalam python 3.8 setelah PEP 570 diterima. Awalnya notasi ini didefinisikan dalam PEP 457 - Notasi untuk Notasi Untuk Parameter Hanya-Posisi

Parameter dalam definisi fungsi sebelum Foraward slash (/) hanya bersifat posisional dan parameter yang diikuti oleh slash (/) dapat berupa apa saja sesuai sintaks. Di mana argumen dipetakan ke parameter hanya posisi hanya berdasarkan posisi mereka saat memanggil fungsi. Melewati parameter hanya posisi dengan kata kunci (nama) tidak valid.

Mari kita ambil contoh berikut

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

Di sini, di atas, definisi fungsi parameter a dan b adalah hanya-posisi, sedangkan x atau y dapat berupa posisi atau kata kunci.

Panggilan fungsi berikut ini valid

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

Namun, pemanggilan fungsi berikut ini tidak valid yang menimbulkan pengecualian TypeError karena a, b tidak dilewatkan sebagai argumen posisi alih-alih dilewatkan sebagai kata kunci

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

TypeError: foo () mendapatkan beberapa argumen hanya posisi yang dilewatkan sebagai argumen kata kunci: 'a, b'

Banyak fungsi bawaan di python menerima argumen hanya posisi di mana melewati argumen dengan kata kunci tidak masuk akal. Misalnya fungsi bawaan len hanya menerima satu argumen posisi (saja), Di mana memanggil len sebagai len (obj = "hello world") mengganggu keterbacaan, periksa bantuan (len).

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

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

Parameter hanya posisi membuat fungsi c / library yang mendasarinya mudah dipelihara. Ini memungkinkan nama parameter hanya parameter posisi menjadi perubahan di masa mendatang tanpa risiko melanggar kode klien yang menggunakan API

Last but not least, parameter hanya posisi memungkinkan kita untuk menggunakan nama mereka untuk digunakan dalam argumen kata kunci panjang variabel. Lihat contoh berikut

>>> 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}

Parameter hanya posisi lebih baik Dijelaskan di sini di Jenis argumen fungsi dalam python: Parameter Hanya Posisi

Sintaks parameter hanya-posisi secara resmi ditambahkan ke python3.8. Lihat apa yang baru python3.8 - hanya argumen posisi

Terkait PEP: PEP 570 - Parameter Hanya-Posisi Python

Neotam
sumber