Qual è un modo standard per eseguire una no-op in Python?


160

Mi trovo spesso a scrivere se / elif / else costruisce in Python e voglio includere opzioni che possono verificarsi, ma per le quali l'azione corrispondente è di non fare nulla. Mi rendo conto che potrei semplicemente escludere quelle istruzioni if, ma per leggibilità trovo che aiuti a includerle tutte, in modo che se stai guardando attraverso il codice puoi vedere cosa succede come risultato di ogni opzione. Come posso codificare la no-op? Attualmente lo sto facendo in questo modo:

no_op = 0

if x == 0:
    y = 2 * a
elif x == 1:
    z = 3 * b
elif x == 3:
    no_op

(Il codice è in realtà un po 'più lungo di così, e più complicato. Questo è solo per illustrare la struttura).

Non mi piace usare una variabile come no-op, ma è il modo più semplice in cui mi viene in mente. C'è un modo migliore?


1
Anche questa ellissi ( ...) merita una menzione: stackoverflow.com/a/6189281/38281
Patrick

Risposte:


288

Usa pass per no-op:

if x == 0:
  pass
else:
  print "x not equal 0"

Ed ecco un altro esempio:

def f():
  pass

O:

class c:
  pass

3
Come one-liner, io uso doSQL = lambda *x:x.
Cees Timmerman,

2
È possibile utilizzare "Nessuno" al posto di "pass" ma non chiarisce alcun codice.
DevPlayer il

È supportato per le operazioni ternarie, in particolare sotto else?
Alexej Magura,

2
@AlexejMagura No, perché passnon è un valore. Inoltre non riesco a vedere come potrebbe essere utile.
L3viathan,


12

Se hai bisogno di una funzione che si comporta come un nop, prova

nop = lambda *a, **k: None
nop()

A volte faccio cose del genere quando rendo le dipendenze opzionali:

try:
    import foo
    bar=foo.bar
    baz=foo.baz
except:
    bar=nop
    baz=nop

# Doesn't break when foo is missing:
bar()
baz()

1
Questa è una buona soluzione quando si ha bisogno di nopin un contesto che richiede espressamente un'espressione (rispetto a una dichiarazione arbitraria; qv docs.python.org/3/reference/simple_stmts.html e docs.python.org/3/reference/compound_stmts. html ) - come ad esempio come sottoespressione di un linguaggio esistente come una comprensione, oppure a lambda, o (dio non voglia) una stringa in cui passare eval(…)(in cui qv docs.python.org/3/library/functions.html# valutare se è necessario).
fish2000,

L'uso lambdaper assegnare una funzione a una variabile per il riutilizzo è uno stile di codifica errato. C'è defper quello.
Bachsau,

0

Un altro modo è con l'ellissi:

def foo():
    ...

Non è meglio che nominare qualsiasi altro oggetto. Si potrebbe anche scrivere None, 136o "NothingHere". Ma il fillgap corretto in Python è pass.
Bachsau,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.