Jaki jest standardowy sposób wykonywania operacji no-op w Pythonie?

160

Często piszę konstrukcje if / elif / else w Pythonie i chcę dołączyć opcje, które mogą wystąpić, ale dla których odpowiednia akcja nie polega na nic. Zdaję sobie sprawę, że mógłbym po prostu wykluczyć te instrukcje if, ale ze względu na czytelność uważam, że pomocne jest uwzględnienie ich wszystkich, więc jeśli przeglądasz kod, możesz zobaczyć, co się dzieje w wyniku każdej opcji. Jak zakodować brak operacji? Obecnie robię to tak:

no_op = 0

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

(Kod jest w rzeczywistości nieco dłuższy i bardziej skomplikowany. To jest tylko dla zilustrowania struktury).

Nie lubię używać zmiennej jako no-op, ale to najładniejszy sposób, jaki mogłem wymyślić. Czy jest lepszy sposób?

Ben
źródło
1
Ten wielokropek ( ...) również zasługuje na wzmiankę: stackoverflow.com/a/6189281/38281
Patrick

Odpowiedzi:

288

Użyj przepustki, aby nie grać:

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

A oto kolejny przykład:

def f():
  pass

Lub:

class c:
  pass
Brian R. Bondy
źródło
3
Jako jednolinijkowy używam doSQL = lambda *x:x.
Cees Timmerman
2
Możesz użyć „None” zamiast „pass”, ale nie wyjaśnia to żadnego kodu.
DevPlayer,
Czy jest to obsługiwane w przypadku operacji trójskładnikowych, szczególnie w ramach else?
Alexej Magura
2
@AlexejMagura Nie, ponieważ passnie jest wartością. Nie rozumiem też, jak mogłoby się to przydać.
L3viathan
25

A co powiesz pass?

Johan Kotlinski
źródło
12

Jeśli potrzebujesz funkcji, która zachowuje się jak nop, spróbuj

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

Czasami robię takie rzeczy, gdy ustawiam zależności jako opcjonalne:

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
źródło
1
Jest to dobre obejście, gdy potrzebny nopjest kontekst, który wymaga konkretnie wyrażenia (w przeciwieństwie do arbitralnej instrukcji; qv docs.python.org/3/reference/simple_stmts.html i docs.python.org/3/reference/compound_stmts. html ) - jak np. jako podwyrażenie do istniejącego idiomu kodu, takiego jak rozumienie, lub a lambda, lub (nie daj Boże ) ciąg do przekazania eval(…)(który qv docs.python.org/3/library/functions.html# eval, jeśli musisz).
fish2000
Używanie lambdado przypisywania funkcji do zmiennej w celu ponownego użycia jest złym stylem kodowania. Jest defza to.
Bachsau
0

Innym sposobem jest wielokropek:

def foo():
    ...
Ray Z.
źródło
To nie jest lepsze niż zwykłe nazwanie innego obiektu. Można również napisać None, 136lub "NothingHere". Ale prawidłowe wypełnienie w Pythonie to pass.
Bachsau