Cách tiêu chuẩn để thực hiện no-op trong python là gì?


160

Tôi thường thấy mình viết if / elif / other xây dựng trong python và tôi muốn bao gồm các tùy chọn có thể xảy ra, nhưng hành động tương ứng là không làm gì cả. Tôi nhận ra rằng tôi chỉ có thể loại trừ những câu lệnh if, nhưng để dễ đọc tôi thấy nó giúp bao gồm tất cả chúng, để nếu bạn đang xem qua mã, bạn có thể thấy những gì xảy ra do kết quả của mỗi tùy chọn. Làm thế nào để tôi mã hóa no-op? Hiện tại, tôi đang làm như thế này:

no_op = 0

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

(Mã thực sự dài hơn một chút và phức tạp hơn. Đây chỉ là để minh họa cấu trúc).

Tôi không thích sử dụng một biến là không có, nhưng đó là cách gọn gàng nhất mà tôi có thể nghĩ ra. Có cách nào tốt hơn?


1
Ellipsis ( ...) này cũng xứng đáng được đề cập: stackoverflow.com/a/6189281/38281
Patrick

Câu trả lời:


288

Sử dụng pass cho no-op:

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

Và đây là một ví dụ khác:

def f():
  pass

Hoặc là:

class c:
  pass

3
Là một lót, tôi sử dụng doSQL = lambda *x:x.
Cees Timmerman

2
Bạn có thể sử dụng "Không" thay cho "vượt qua" nhưng nó không làm rõ mã nào.
DevPlayer

Điều này có được hỗ trợ cho các hoạt động ternary, đặc biệt là theo else?
Alexej Magura

2
@AlexejMagura Không, vì passkhông phải là một giá trị. Tôi cũng không thể thấy nó hữu ích như thế nào.
L3viathan


12

Nếu bạn cần một chức năng hoạt động như một nop, hãy thử

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

Đôi khi tôi làm những việc như thế này khi tôi thực hiện tùy chọn phụ thuộc:

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

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

1
Đây là một cách giải quyết tốt khi một người cần nopmột bối cảnh đặc biệt yêu cầu một biểu thức (so với một tuyên bố tùy tiện; qv docs.python.org/3/reference/simple_stmts.htmldocs.python.org/3/reference/compound_stmts. html ) - ví dụ như là một biểu thức con cho một thành ngữ mã hiện có như một sự hiểu biết, hoặc một lambda, hoặc (thần cấm) một chuỗi được truyền vào eval(…)(mà qv docs.python.org/3/l Library / fiances.html# eval nếu bạn phải).
cá2000

Sử dụng lambdađể gán một hàm cho một biến để sử dụng lại là kiểu mã hóa xấu. Có defđiều đó.
Bachsau

0

Một cách khác là với Ellipsis:

def foo():
    ...

Điều đó không tốt hơn là chỉ đặt tên cho bất kỳ đối tượng nào khác. Bạn cũng có thể viết None, 136hoặc "NothingHere". Nhưng fillgap chính xác trong python là pass.
Bachsau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.