Was ist eine Standardmethode, um in Python ein No-Op durchzuführen?

160

Ich schreibe oft if / elif / else-Konstrukte in Python und möchte Optionen einschließen, die auftreten können, für die die entsprechende Aktion jedoch darin besteht, nichts zu tun. Mir ist klar, dass ich diese if-Anweisungen einfach ausschließen könnte, aber aus Gründen der Lesbarkeit finde ich es hilfreich, sie alle einzuschließen, damit Sie beim Durchsuchen des Codes sehen können, was als Ergebnis jeder Option passiert. Wie codiere ich das No-Op? Derzeit mache ich das so:

no_op = 0

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

(Der Code ist tatsächlich etwas länger und komplizierter. Dies dient nur zur Veranschaulichung der Struktur.)

Ich mag es nicht, eine Variable als No-Op zu verwenden, aber es ist die beste Art, die ich mir vorstellen kann. Gibt es einen besseren Weg?

Ben
quelle
1
Diese Ellipse ( ...) verdient auch eine Erwähnung: stackoverflow.com/a/6189281/38281
Patrick

Antworten:

288

Verwenden Sie den Pass für No-Op:

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

Und hier ist ein weiteres Beispiel:

def f():
  pass

Oder:

class c:
  pass
Brian R. Bondy
quelle
3
Als Einzeiler benutze ich doSQL = lambda *x:x.
Cees Timmerman
2
Sie könnten "None" anstelle von "pass" verwenden, aber es wird kein Code geklärt.
DevPlayer
Wird dies für ternäre Operationen unterstützt, insbesondere unter else?
Alexej Magura
2
@AlexejMagura Nein, weil passes kein Wert ist. Ich kann auch nicht sehen, wie es nützlich sein könnte.
L3viathan
25

Wie wäre es pass?

Johan Kotlinski
quelle
12

Wenn Sie eine Funktion benötigen, die sich wie ein NOP verhält, versuchen Sie es

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

Manchmal mache ich solche Dinge, wenn ich Abhängigkeiten optional mache:

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

# Doesn't break when foo is missing:
bar()
baz()
Andrew Wagner
quelle
1
Dies ist eine gute Problemumgehung, wenn Sie das nopin einem Kontext benötigen, der speziell einen Ausdruck erfordert (im Vergleich zu einer beliebigen Anweisung; siehe docs.python.org/3/reference/simple_stmts.html und docs.python.org/3/reference/compound_stmts. html ) - wie z. B. als Unterausdruck zu einer vorhandenen Code-Sprache wie einem Verständnis oder einer lambdaoder (Gott bewahre) einer Zeichenfolge, an die übergeben werden soll eval(…)(siehe qs. docs.python.org/3/library/functions.html#) eval wenn du musst).
fish2000
Die lambdaZuweisung einer Funktion zu einer Variablen zur Wiederverwendung ist ein schlechter Codierungsstil. Dafür gibt defes.
Bachsau vor
0

Ein anderer Weg ist mit Ellipse:

def foo():
    ...
Ray Z.
quelle
Das ist nicht besser als nur ein anderes Objekt zu benennen. Man könnte auch schreiben None, 136oder "NothingHere". Aber die richtige Lücke in Python ist pass.
Bachsau vor