Quale sarebbe il modo migliore per verificare se una variabile è stata passata per lo script:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
Quale sarebbe il modo migliore per verificare se una variabile è stata passata per lo script:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
Risposte:
Alla fine, la differenza tra try, except
e test len(sys.argv)
non è poi così significativa. Sono entrambi un po 'hacker rispetto a argparse
.
Questo mi viene in mente, tuttavia, come una sorta di argparse a basso budget:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
Potresti persino usarlo per generare un namedtuple
con valori impostati per impostazione predefinita None
- tutto in quattro righe!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
Nel caso in cui non hai familiarità namedtuple
, è solo una tupla che agisce come un oggetto, permettendoti di accedere ai suoi valori usando la tup.attribute
sintassi invece della tup[0]
sintassi.
Quindi la prima riga crea un nuovo namedtuple
tipo con valori per ciascuno dei valori in arg_names
. La seconda riga passa i valori dal args
dizionario, utilizzando get
per restituire un valore predefinito quando il nome dell'argomento specificato non ha un valore associato nel dizionario.
Controlla la lunghezza di sys.argv
:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
Alcune persone preferiscono l'approccio basato sulle eccezioni che hai suggerito (ad es. try: blah = sys.argv[1]; except IndexError: blah = 'blah'
), Ma non mi piace così tanto perché non "scala" altrettanto bene (ad es., Quando vuoi accettare due o tre argomenti) e può potenzialmente nascondere errori (ad esempio, se si utilizza blah = foo(sys.argv[1])
, ma si foo(...)
solleva un IndexError
, questo IndexError
verrebbe ignorato).
try, except
. Aspetta solo il foo
tuo argomento fino alla else
clausola.
argparse
.
argparse.py
in tutti i miei progetti da riga di comando.
try
clausola ... Quindi, dato che non è più difficile (e, IMO, un po 'più carina), preferisco controllare solo la lunghezza (inoltre, eviti che le persone sgridarti per aver utilizzato le eccezioni per il controllo del flusso).
try
apologeta, devo ammetterlo. Sento solo che a volte esprime il mio intento più chiaramente di if
un'affermazione.
Un altro modo che non ho ancora visto elencato è impostare il valore della tua sentinella in anticipo. Questo metodo sfrutta la valutazione lenta di Python, in cui non è sempre necessario fornire else
un'istruzione. Esempio:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
Oppure, se stai usando la sintassi PAZZO, potresti usare l' operatore ternario di Python :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
Lo uso - non fallisce mai:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpoint
variabile dall'esempio, ma la domanda è l'assegnazione di una variabile di fallback, quindi ho fatto lo stesso.
sys.argv[1:]:
. Funziona con argomenti posizionali mentre count no.
È un normale elenco di Python. L'eccezione che potresti catturare per questo è IndexError, ma è meglio controllare solo la lunghezza.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
Una soluzione che funziona con la funzione integrata della mappa!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
Quindi devi solo chiamare i tuoi parametri in questo modo:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
Puoi semplicemente aggiungere il valore di argv [1] ad argv e quindi controllare se argv [1] non è uguale alla stringa che hai immesso Esempio:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])
Abbastanza vicino a ciò che l'originatore stava cercando di fare. Ecco una funzione che utilizzo:
def get_arg(index):
try:
sys.argv[index]
except IndexError:
return ''
else:
return sys.argv[index]
Quindi un utilizzo sarebbe qualcosa del tipo:
if __name__ == "__main__":
banner(get_arg(1),get_arg(2))