Che cosa significa la barra nell'output di help ()?


148

Cosa /significa l' helpoutput di Python 3.4 rangeprima della parentesi di chiusura?

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

                                        ...

Risposte:


185

Indica la fine dei soli parametri posizionali , parametri che non è possibile utilizzare come parametri di parole chiave. Prima di Python 3.8, tali parametri potevano essere specificati solo nell'API C.

Significa che l' keyargomento __contains__può essere passato solo da position ( range(5).__contains__(3)), non come argomento di parole chiave ( range(5).__contains__(key=3)), qualcosa che puoi fare con argomenti posizionali nelle funzioni pure-python.

Vedi anche la documentazione di Argument Clinic :

Per contrassegnare tutti i parametri come solo posizionali in Argument Clinic, aggiungere a /su una riga da solo dopo l'ultimo parametro, rientrato allo stesso modo delle righe dei parametri.

e la (aggiunta molto recente a) le FAQ di Python :

Una barra nell'elenco degli argomenti di una funzione indica che i parametri precedenti sono solo posizionali. I parametri solo posizionali sono quelli senza un nome utilizzabile esternamente. Quando si chiama una funzione che accetta parametri solo posizionali, gli argomenti vengono mappati su parametri basati esclusivamente sulla loro posizione.

La sintassi ora fa parte delle specifiche del linguaggio Python, a partire dalla versione 3.8 , vedere PEP 570 - Parametri solo posizionali di Python . Prima di PEP 570, la sintassi era già riservata per una possibile inclusione futura in Python, vedere PEP 457 - Sintassi per parametri solo posizionali .

I parametri solo posizionali possono portare a API più pulite e più chiare, rendere le implementazioni pure-Python di moduli solo C più più coerenti e più facili da mantenere e, poiché i parametri solo posizionali richiedono un'elaborazione molto ridotta, portano a un codice Python più veloce.


22

Ho posto questa domanda da solo. :) Ho scoperto che /originariamente era stato proposto da Guido qui .

Proposta alternativa: che ne dici di usare '/'? È un po 'l'opposto di' * 'che significa "argomento della parola chiave" e' / 'non è un nuovo carattere.

Quindi la sua proposta ha vinto .

Eh. Se questo è vero, la mia proposta '/' vince:

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

Penso che il documento molto rilevante a riguardo sia PEP 570 . Dove la sezione di riepilogo sembra bella.

Ricapitolare

Il caso d'uso determinerà quali parametri utilizzare nella definizione della funzione:

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

Come guida:

Usa solo posizionale se i nomi non contano o non hanno significato e ci sono solo alcuni argomenti che verranno sempre passati nello stesso ordine. Usa solo parole chiave quando i nomi hanno un significato e la definizione della funzione è più comprensibile essendo esplicita con i nomi.


Se la funzione termina con /

def foo(p1, p2, /)

Ciò significa che tutti gli argomenti funzionali sono posizionali.


6
Scegliere il /token, perché "è l'operazione inversa di *" mostra che Python è solo un po 'pazzo. È una specie di sinestesia.
Tomasz Gandor,

6

Forward Slash (/) indica che tutti gli argomenti precedenti sono solo argomenti posizionali. La funzione degli argomenti solo posizionali è stata aggiunta in Python 3.8 dopo l' accettazione di PEP 570 . Inizialmente questa notazione è stata definita in PEP 457 - Notazione per notazione per parametri solo posizionali

I parametri nella definizione della funzione precedente alla barra (/) sono posizionali e i parametri seguiti dalla barra (/) possono essere di qualsiasi tipo secondo la sintassi. Dove gli argomenti sono associati a parametri posizionali solo in base alla loro posizione al momento della chiamata di una funzione. Il passaggio di parametri solo posizionali per parole chiave (nome) non è valido.

Facciamo il seguente esempio

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

Qui nei parametri di definizione della funzione sopra a e b sono solo posizionali, mentre x o y possono essere posizionali o parole chiave.

Sono valide le seguenti chiamate di funzione

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

Tuttavia, la seguente chiamata di funzione non è valida e genera un'eccezione TypeError poiché a, b non vengono passati come argomenti posizionali invece passati come parola chiave

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

TypeError: foo () ha ottenuto alcuni argomenti solo posizionali passati come argomenti di parole chiave: 'a, b'

Molte funzioni integrate in Python accettano argomenti solo posizionali in cui non ha senso passare argomenti per parola chiave. Ad esempio la funzione incorporata len accetta solo un argomento posizionale (solo), dove chiamare len come len (obj = "ciao mondo") compromette la leggibilità, controlla aiuto (len).

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

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

I parametri solo posizionali semplificano la manutenzione delle funzioni c / library sottostanti. Consente ai nomi dei parametri dei soli parametri posizionali di essere modificati in futuro senza il rischio di interrompere il codice client che utilizza l'API

Ultimo ma non meno importante, solo i parametri posizionali ci consentono di utilizzare i loro nomi per essere utilizzati in argomenti di parole chiave a lunghezza variabile. Controlla il seguente esempio

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

I parametri solo posizionali sono meglio spiegati qui in Tipi di argomenti di funzioni in python: Parametri solo posizionali

La sintassi dei parametri solo posizionali è stata aggiunta ufficialmente a python3.8. Checkout cosa c'è di nuovo python3.8 - solo argomenti posizionali

Correlazione PEP: PEP 570 - Parametri solo posizionali Python

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.