Який стандартний спосіб зробити безвідмовної роботи в python?


160

Я часто буваю писати, якщо / elif / else конструює в python, і я хочу включити варіанти, які можуть виникати, але для яких відповідна дія - нічого не робити. Я усвідомлюю, що міг би просто виключити ці, якщо заяви, але для читабельності я вважаю, що це допомагає включити їх усі, так що якщо ви переглядаєте код, ви зможете побачити, що відбувається в результаті кожного варіанту. Як зашифрувати безрецептурну програму? В даний час я роблю це так:

no_op = 0

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

(Код насправді досить довший за це, і складніший. Це просто для ілюстрації структури).

Мені не подобається використовувати змінну як неоперативний, але це найменший спосіб, про який я міг придумати. Чи є кращий спосіб?


1
Цей Еліпсіс ( ...) також заслуговує на згадку: stackoverflow.com/a/6189281/38281
Патрік

Відповіді:


288

Використовуйте пропуск для безперебійного використання:

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

І ось ще один приклад:

def f():
  pass

Або:

class c:
  pass

3
Як однолінійний я використовую doSQL = lambda *x:x.
Cees Timmerman

2
Ви можете використовувати "None" замість "pass", але код не уточнює.
DevPlayer

Чи підтримується це для потрійних операцій, особливо в рамках програми else?
Олексій Магура

2
@AlexejMagura Ні, тому що passце не значення. Я також не бачу, як це може бути корисним.
L3viathan


12

Якщо вам потрібна функція, яка веде себе як ноп, спробуйте

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

Іноді я роблю такі речі, коли роблю залежності необов'язковими:

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

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

1
Це вдале вирішення, коли потрібно nopконтекст, який конкретно вимагає вираження (проти довільного твердження; qv docs.python.org/3/reference/simple_stmts.html та docs.python.org/3/reference/compound_stmts. html ) - як, наприклад, як підвираз до існуючої ідіоми коду, як розуміння, або a lambda, або (не дай Бог) рядок, який слід передавати eval(…)(який qv docs.python.org/3/library/functions.html# eval, якщо треба).
fish2000

Використання lambdaдля призначення функції змінної для повторного використання - це поганий стиль кодування. Там defдля цього.
Бахсау

0

Ще один спосіб - за допомогою Ellipsis:

def foo():
    ...

Це не краще, ніж просто назвати будь-який інший об’єкт. Ви також можете написати None, 136або "NothingHere". Але правильний заповнення в python є pass.
Бахсау
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.