I callback dovrebbero essere chiamati con argomenti denominati o posizionali?

1

La domanda viene posta nel contesto di Python, ma è anche rilevante per tutte le lingue con supporto per i parametri denominati.

Se qualche entità nel mio codice (ad esempio un'implementazione di pubsub) o anche una semplice funzione accetta un callback, ha più senso chiamarlo con argomenti posizionali o con argomenti con nome?

def foo(on_foo_ended):
    foo_result = await ...

    # Call with positional argument:
    on_foo_ended(foo_result)

    # Call with named argument:
    on_foo_ended(result=foo_result)

Una chiamata con argomenti posizionali non richiede alcuna definizione arbitraria dei parametri da parte dell'utente, ma può invece imporre un ordinamento arbitrario dei parametri. Gli argomenti con nome richiedono nomi di parametri corrispondenti, ma sono (in qualche misura) autodocumentanti e non obbligano l'utente ad ordinarli.

Supponendo che stiamo sviluppando una libreria, sarebbe preferibile usare la convenzione più comune se ce n'è una. Se non ce n'è, avrebbe senso preferire un modo all'altro? Suppongo che strategie complesse come "passare l'argomento posizionale quando c'è solo uno e gli argomenti nominati quando ci sono due o più" sarebbero troppo arbitrarie e probabilmente difficili da usare.

    
posta interphx 28.02.2017 - 18:37
fonte

1 risposta

4

Qualsiasi scelta va bene, purché tu chiaramente dichiari come stai chiamando il callback. Ho trovato che un'invocazione di esempio funziona molto bene, cioè mostra questo nei tuoi documenti:

on_foo_ended(result=foo_result)

Tendo a preferire gli argomenti posizionali per i callback, poiché ciò evita di forzare un determinato nome parametro sui miei utenti. Questo è particolarmente vero se il tuo dominio problematico è diverso dal dominio problematico dell'utente. Se un result è sempre un result per i tuoi utenti, va bene, ma cosa succede se è un confirmationRequest , trade_counterparty , download_link o completamente ignorato _ ?

Un altro motivo per preferire gli argomenti posizionali è se stai usando il modulo typing . Il tipo typing.Callable può rappresentare solo argomenti posizionali, non argomenti con nome. Questo è abbastanza fastidioso, ma in alcuni casi d'uso è più prezioso accettare le restrizioni del sistema di tipo statico.

Ovviamente questi motivi non sono molto forti in quanto gli utenti possono sempre fornire un semplice adattatore lambda result: actual_function(result) , quindi si riduce a: fai tutto ciò che vuoi documentare.

    
risposta data 28.02.2017 - 21:44
fonte

Leggi altre domande sui tag