vero, la maggior parte dei linguaggi di programmazione make ordine dei parametri parte del contratto funzione di chiamata, ma questo non ha bisogno di essere così. Perché dovrebbe? La mia comprensione della domanda è, quindi, se Python è diverso dagli altri linguaggi di programmazione a questo riguardo. In aggiunta alle altre buone risposte per Python 2, si prega di considerare quanto segue:
__named_only_start = object()
def info(param1,param2,param3,_p=__named_only_start,spacing=10,collapse=1):
if _p is not __named_only_start:
raise TypeError("info() takes at most 3 positional arguments")
return str(param1+param2+param3) +"-"+ str(spacing) +"-"+ str(collapse)
L'unico modo un chiamante sarebbe in grado di fornire argomenti spacing
e collapse
posizionale (senza eccezione) sarebbe:
info(arg1, arg2, arg3, module.__named_only_start, 11, 2)
La convenzione di non utilizzare elementi privati appartenenti ad altri moduli è già di base in Python. Come con Python stesso, questa convenzione per i parametri sarebbe solo parzialmente applicata.
Altrimenti, chiamate sarebbero devono essere della forma:
info(arg1, arg2, arg3, spacing=11, collapse=2)
Una chiamata
info(arg1, arg2, arg3, 11, 2)
assegnerebbe valore 11 al parametro _p
e un'eccezione aumentata di prima istruzione della funzione.
Caratteristiche:
- parametri prima
_p=__named_only_start
Sono ammessi posizionale (o per nome).
- I parametri dopo
_p=__named_only_start
devono essere forniti solo per nome (a meno che la conoscenza dell'oggetto speciale sentinella __named_only_start
sia stata ottenuta e utilizzata).
Pro:
- parametri sono espliciti in numero e senso (il più tardi se si scelgono anche nomi buoni, ovviamente).
- Se la sentinella viene specificata come primo parametro, tutti gli argomenti devono essere specificati per nome.
- Quando si chiama la funzione, è possibile passare alla modalità posizione utilizzando l'oggetto sentinella
__named_only_start
nella posizione corrispondente.
- È possibile prevedere prestazioni migliori rispetto ad altre alternative.
Contro:
Controllo si verifica durante l'esecuzione, non in fase di compilazione.
- Utilizzo di un parametro aggiuntivo (anche se non argomento) e un controllo aggiuntivo. Piccolo degrado delle prestazioni rispetto alle normali funzioni.
- La funzionalità è un hack senza supporto diretto da parte della lingua (vedere la nota sotto).
- Quando si chiama la funzione, è possibile passare alla modalità posizione utilizzando l'oggetto sentinella
__named_only_start
nella posizione corretta. Sì, questo può anche essere visto come un professionista.
Si prega di tenere presente che questa risposta è valida solo per Python 2. Python 3 implementa il meccanismo simile, ma molto elegante, supportato dalla lingua descritto in altre risposte.
Ho scoperto che quando apro la mente e ci penso, nessuna domanda o altra decisione sembra stupida, stupida o semplicemente sciocca. Al contrario, di solito imparo molto.
Per le persone che cercano la fonte della sua citazione, è nei documenti Python 3: https://docs.python.org/3.5/reference/compound_stmts.html#function-definitions – phoenix
Con ** kwargs: 'def foo (pos, *, forcenamed, ** kwargs) '. – Jerther