Qual è il modo sicuro di utilizzare argomenti solo per parole chiave?

3

Argomenti basati su parole chiave sono argomenti che possono essere forniti solo a funzione per parola chiave. In Python sono definiti da un singolo asterisco nella firma di una funzione. Ad esempio:

>>> def foo(bar, *, baz):
        print(bar, baz)
>>> foo(1, baz=2)
    1 2
>>> foo(1, 2)
TypeError: foo() takes 1 positional argument but 2 were given

L'utilizzo di questi non ha solo vantaggi e svantaggi stilistici, ma anche funzionale. Ecco alcuni dei quali sono a conoscenza:

Vantaggi:

  • È meno soggetto a errori. Quando si hanno argomenti posizionali in una chiamata di funzione, cambiare una firma può rompere le cose. Con argomenti solo parole chiave non esiste un problema di questo tipo. ( link , link , < a href="https://bugs.python.org/issue25628"> link )

E svantaggi:

  • Rendendo tutti gli argomenti solo per parole chiave non è consentito utilizzare la funzione con map . Ad esempio:

    >>> def square(*, x):
            return x * 2
    
    >>> list(map(square, [1, 2, 3]))
    TypeError: square() takes 0 positional arguments but 1 was given
    

Non sono riuscito a trovare una descrizione generale su come dovrei usare correttamente gli argomenti solo per le parole chiave in PEP 3102 che li ha proposti in primo luogo o in altre fonti.

Quindi, le mie domande sono: ci sono altre insidie di cui sono inconsapevole quando uso argomenti con parole chiave? Come posso usarli tranquillamente senza potenzialmente rompere qualcosa in futuro?

    
posta Georgy 24.12.2018 - 21:26
fonte

3 risposte

3

In effetti, le caratteristiche linguistiche hanno insidie, costi e benefici. Il punto centrale delle guide di stile del linguaggio di programmazione (ad esempio Guide di stile di Google ) e JavaScript: The Good Parts serve per evitare funzionalità o usi sorprendenti, soggetti a errori, ingannevoli o difficili da mantenere.

Ecco alcuni casi validi per argomenti con parole chiave:

  • Opzioni non ovvie sul sito di chiamata, esp. bandiere booleane e opzioni multiple. Per io.open () , sarebbe ragionevole (tranne che per la compatibilità con le versioni precedenti) crea tutti gli argomenti dopo file e mode essere solo per parole chiave:
    io.open(file, 'r', 0, None, '', '', False)
  • Argomenti che non sono facili da mantenere dritti:
    def address(*, country, administrative_area, sub_administrative_area, locality, dependent_locality, postal_code, thoroughfare, premise)
  • Argomenti che vuoi richiedere ai chiamanti di passare esplicitamente:
    def delete(base, *, recursive)
  • Opzioni per una funzione che accetta anche varargs:
    def send(topic, message, *values, debug=True)
  • Opzioni per una funzione che potrebbe assumere vararg in futuro. Questo è sicuramente un giudizio . Il punto è l'aggiunta di un parametro varargs che interromperà qualsiasi chiamante che passa un'opzione come parametro posizionale. La definizione delle opzioni come parametri solo per le parole chiave consente di aggiungere un parametro varags.
    def send(topic, message, *, debug=True)

Qui ci sono alcuni casi in cui non si usano argomenti di parole chiave:

  • Codice che deve essere compatibile con Python 2.
  • Programmazione funzionale generica: map() , filter() , apply() , ...
  • Funzioni a un argomento: repr(object) .
  • Vararg: max(x, y, z, t) .
  • Dove gli argomenti solo per le parole chiave aggiungerebbero verbosità e confusione senza alcun vantaggio: bitwise_and(x1, x2) . [ numpy.bitwise_and() prende questi due argomenti e un mucchio di argomenti facoltativi che sono un gioco leale solo per parole chiave, tranne che per la compatibilità.]

e alcune altre insidie di argomenti con parole chiave:

  • È ancora un'altra funzione per i nuovi membri del team per imparare quando stanno arrivando alla velocità su Python e sulla tua base di codice.
  • Extra complessità e distrazione nella definizione della funzione. (Che cos'è * ?)
  • Alcuni strumenti di sviluppo potrebbero non gestirli bene: evidenziatori di sintassi, strumenti di diff, editor di refactoring, ispettori di codici, generatori di codice C interop, RPC (chiamata a procedura remota), ...
  • Le funzionalità linguistiche possono interagire tra loro in modi sorprendenti. "La perfezione è raggiunta, non quando non c'è altro da aggiungere, ma quando non c'è più nulla da togliere". - Antoine de Saint-Exupery.
risposta data 30.12.2018 - 00:36
fonte
2

Gli argomenti basati solo su parole chiave sono solo uno strumento e non esiste un uno strumento perfetto per tutto . Quando non funziona, come nel caso di mappa , usi gli argomenti posizionali.

È possibile utilizzare gli argomenti relativi alle parole chiave in modo sicuro. Cambiare codice, refactoring, è un modo comune di gestione con preoccupazioni per il futuro . Invece di prevedere il futuro, ti adatti alle esigenze attuali.

La migliore pratica per gli argomenti con parole chiave è la risposta alle preferenze personali e alla progettazione del software.

Risultato casuale della ricerca su Internet: 4 Best practice per gli argomenti delle funzioni link

    
risposta data 29.12.2018 - 18:24
fonte
1

Non ci sono particolari svantaggi nell'usare argomenti solo per parole chiave.

È vero, la tua funzione avrà una firma diversa da quelle con argomenti posizionali e quindi non funzionerà con altre funzioni che si aspettano di essere passate a funzioni che corrispondono a una particolare firma.

Questo è vero per qualsiasi cambiamento incompatibile nella firma e può essere facilmente risolto avvolgendo la tua funzione.

Potresti se volessi scrivere anche una funzione mappa che ispeziona gli argomenti e usa il primo argomento di parole chiave, quando si verifica questo caso.

Anche se penso che direi che è assurdo per una funzione con un singolo argomento forzare l'uso di una parola chiave e lanciare l'errore ha senso quanto l'implementazione di questo comportamento.

    
risposta data 02.01.2019 - 12:42
fonte

Leggi altre domande sui tag