Quando un argomento dovrebbe essere impostato su Nessuno in Python?

Sep 10 2020

Il fulcro della mia domanda è sul design.

Se ho un argomento che può essere Nonee viene passato tra diverse funzioni fino a quando non viene finalmente utilizzato, quale funzione dovrebbe trattarlo come argomento predefinito?

Ad esempio, supponiamo il seguente blocco di codice:

def foo(a):
 b = # some code block to assign b
 return bar(a, b)

def bar(a, b):
 c = # some code block to assign c
 return baz(a, b, c)

def baz(a, b, c):
 return a + b + c

Il valore predefinito dovrebbe essere impostato solo in fooe tutte le altre funzioni devono aspettarsi l'argomento come obbligatorio (ad esempio, foo(a=None); bar(a, b); baz(a, b, c))? O c'è un design migliore?

E se fosse necessaria la verifica del tipo, qual è la funzione più adatta a questo?

Risposte

4 DocBrown Sep 10 2020 at 09:55

Per prendere una decisione sensata sugli argomenti predefiniti, è necessario conoscere il contesto in cui verranno utilizzate queste funzioni! .

Se foofarà parte dell'API pubblica di un modulo o componente, fornire un argomento predefinito a=Nonepresuppone che esista uno scenario di utilizzo frequente in cui foo()verrà chiamato in questa forma, senza alcun parametro. La stessa misura vale per bare baz:

  • quelle funzioni sono usate solo "internamente"? Quindi sai esattamente se fornire un argomento predefinito ti farà risparmiare del codice ripetitivo, o se bar(a, b)viene chiamato solo una o due volte, forse solo all'interno foo, nel qual caso un argomento predefinito non è vantaggioso

  • o anche queste funzioni fanno parte dell'API pubblica? Quindi è necessario stimare come sarà il loro tipico scenario di utilizzo (per il quale è necessario un contesto reale). Se si desidera fornire la possibilità bardi essere chiamati simili bar(b="some value"), bar(a=none, b)è necessario fornire la firma , indipendentemente dal parametro predefinito in foo.

Quindi, per prendere decisioni sugli argomenti predefiniti, non guardare al lato dell'implementazione, guarda al lato dell'utilizzo!

Per quanto riguarda la verifica del tipo: non sono un esperto di questo argomento in Python, ma immagino che se desideri aggiungere annotazioni di tipo per l'analisi del tipo statico, IMHO avrà più senso aggiungerle a ogni livello della catena di chiamate (potrebbe essere effettivamente obbligatorio per far funzionare l'analisi del tipo). Se la "funzione più interna" ( baz) si aspetta solo argomenti di un certo tipo, devi ovviamente mettere lì le annotazioni del tipo. Ciò, tuttavia, implica che fooe barfunzionerà correttamente solo con argomenti dello stesso tipo, il che significa che per l'analisi del tipo statico le annotazioni sono necessarie anche lì.