Slash, help () çıktısında ne anlama geliyor?


148

/Python 3.4'ün kapanış parantezinden önceki helpçıktısı için ne anlama geliyor 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.

                                        ...

Yanıtlar:


185

Bu sonu anlamına konumsal sadece parametrelerin , parametreler olamaz anahtar kelime parametre olarak kullanın. Python 3.8'den önce, bu tür parametreler sadece C API'sinde belirtilebilir.

Bunun anlamı keyiçin argüman __contains__yalnızca konum (tarafından geçirilebilir range(5).__contains__(3)) değil, bir anahtar kelime argüman (olarak range(5).__contains__(key=3)), bir şey olabilir saf piton fonksiyonlarda pozisyonel argümanlarla yapmak.

Ayrıca Argument Clinic belgelerine de bakın :

Bağımsız Değişken Kliniğinde tüm parametreleri yalnızca konum olarak işaretlemek için /, parametre parametresiyle aynı girintili olarak, son parametreden sonra tek başına bir satır ekleyin .

ve Python SSS'ye (çok yeni eklenen) :

Bir işlevin bağımsız değişken listesindeki eğik çizgi, işlevden önceki parametrelerin yalnızca konumsal olduğunu gösterir. Yalnızca konumsal parametreler, harici olarak kullanılabilir bir adı olmayan parametrelerdir. Yalnızca konum parametrelerini kabul eden bir işlev çağrıldığında, argümanlar yalnızca konumlarına göre parametrelere eşlenir.

Sözdizimi şimdi 3.8 sürümünden itibaren Python dil belirtiminin bir parçasıdır , bkz. PEP 570 - Python Yalnızca Konumsal Parametreler . PEP 570'dan önce sözdizimi Python'a gelecekteki olası dahil edilmek için zaten ayrılmıştı, bkz. PEP 457 - Yalnızca Konumsal Parametreler İçin Sözdizimi .

Yalnızca konumsal parametreler daha temiz ve daha temiz API'lere yol açabilir, başka türlü yalnızca C modüllerinin saf Python uygulamalarını daha tutarlı ve bakımı daha kolay hale getirebilir ve yalnızca konumsal parametrelerin çok az işlem gerektirmesi nedeniyle daha hızlı Python koduna yol açar.


23

Bu soruyu kendim sordum. :) /Aslında burada Guido tarafından önerildi öğrendim .

Alternatif teklif: '/' kullanmaya ne dersiniz? Bu, "anahtar kelime argümanı" anlamına gelen '*' ifadesinin tersidir ve '/' yeni bir karakter değildir.

Sonra teklifi kazandı .

Heh. Bu doğruysa, '/' teklifim kazanır:

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

Sanırım bunu kapsayan çok ilgili belge PEP 570 . Özet bölümü güzel görünüyor.

tekrarlamak

Use örneği, işlev tanımında hangi parametrelerin kullanılacağını belirler:

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

Rehberlik olarak:

Yalnızca isimlerin önemi yoksa veya anlamı yoksa ve her zaman aynı sırada iletilecek yalnızca birkaç argüman varsa konumsal kullanın. Yalnızca adların anlamı varsa ve adlarla açık olarak işlev tanımı daha anlaşılır olduğunda yalnızca anahtar kelimeyi kullanın.


İşlev ile biterse /

def foo(p1, p2, /)

Bu, tüm işlevsel argümanların konumsal olduğu anlamına gelir.


6
Simgeyi seçmek /, çünkü "bu ters işlemi *", Python'un biraz çılgın olduğunu gösterir. Bu bir tür sinestezidir.
Tomasz Gandor

7

Eğik Çizgi (/), önceki bağımsız değişkenlerin yalnızca konumsal bağımsız değişken olduğunu belirtir. PEP 570 kabul edildikten sonra sadece konumsal argümanlar özelliği python 3.8'e eklendi . Başlangıçta bu gösterim PEP 457 - Yalnızca Konumsal Parametreler İçin Gösterim İşaretinde tanımlanmıştır

Önceden eğik çizgi (/) işlev tanımındaki parametreler yalnızca konumsaldır ve eğik çizgi (/) izleyen parametreler sözdizimine göre her türlü olabilir. Bağımsız değişkenlerin yalnızca konumsal parametrelerle eşleştirildiği durumlarda, yalnızca bir işlev çağrıldığında konumlarına göre parametreler. Yalnızca konumsal parametrelerin anahtar kelimelerle (ad) geçirilmesi geçersizdir.

Aşağıdaki örneği ele alalım

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

Yukarıdaki fonksiyon tanımında a ve b parametreleri sadece konumsaldır, x veya y ise konumsal veya anahtar kelime olabilir.

Aşağıdaki işlev çağrıları geçerlidir

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

Ancak, aşağıdaki işlev çağrısı geçerli değildir, bu da a, b anahtar kelimesi olarak değil, konum bağımsız değişkenleri olarak iletildiğinden, TypeError istisnasını yükseltir

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

TypeError: foo (), anahtar kelime bağımsız değişkenleri olarak iletilen yalnızca konumla ilgili bağımsız değişkenler aldı: 'a, b'

Python'da yerleşik birçok işlev, yalnızca anahtar sözcükle argüman aktarmanın mantıklı olmadığı konumsal argümanları kabul eder. Örneğin, yerleşik işlev len yalnızca bir konum (yalnızca) bağımsız değişkenini kabul eder, len olarak len (obj = "merhaba dünya") çağrıldığında okunabilirliği bozarsa, yardımı (len) kontrol edin.

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

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

Yalnızca konumsal parametreler altta yatan c / kütüphane işlevlerinin bakımını kolaylaştırır. API kullanan istemci kodunu kırma riski olmadan yalnızca konumsal parametrelerin parametre adlarının gelecekte değişmesine izin verir

Son fakat en önemlisi, yalnızca konumsal parametreler, adlarını değişken uzunluklu anahtar kelime bağımsız değişkenlerinde kullanılacak şekilde kullanmamıza izin verir. Aşağıdaki örneği kontrol edin

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

Yalnızca konumsal parametreler daha iyidir Burada python'daki fonksiyon bağımsız değişkenleri türleri: Yalnızca Konumsal Parametreler

Sadece konumsal parametrelerin sözdizimi python3.8'e resmi olarak eklendi. Ödeme yeni python3.8 ne - pozisyonel sadece argümanlar

PEP İle İlgili: PEP 570 - Python Yalnızca Konumsal Parametreler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.