เป็นวิธีมาตรฐานในการทำ no-op ในหลามอะไร


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
Ellipsis ( ...) นี้สมควรได้รับการกล่าวถึง: stackoverflow.com/a/6189281/38281
Patrick

คำตอบ:


288

ใช้พาสสำหรับ no-op:

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

และนี่เป็นอีกตัวอย่าง:

def f():
  pass

หรือ:

class c:
  pass

3
doSQL = lambda *x:xในฐานะที่เป็นหนึ่งซับใช้ฉัน
Cees Timmerman

2
คุณสามารถใช้ "ไม่มี" แทน "ผ่าน" แต่มันไม่ได้ชี้แจงรหัสใด ๆ
DevPlayer

สิ่งนี้ได้รับการสนับสนุนสำหรับการดำเนินงานแบบไตรภาคโดยเฉพาะอย่างยิ่งภายใต้else?
Alexej Magura

2
@AlexejMagura ไม่เพราะpassไม่ใช่ค่า ฉันไม่เห็นด้วยว่ามันจะมีประโยชน์อย่างไร
L3viathan


12

หากคุณต้องการฟังก์ชั่นที่ทำตัวเหมือน nop ให้ลอง

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 ) - เช่นเช่นเป็นนิพจน์ย่อยของสำนวนรหัสที่มีอยู่เช่นความเข้าใจlambdaหรือ (หรือห้าม) สตริงที่จะส่งผ่านไปeval(…)(ซึ่ง qv docs.python.org/3/library/functions.html# evalถ้าคุณต้อง)
fish2000

การใช้lambdaเพื่อกำหนดฟังก์ชั่นให้กับตัวแปรสำหรับ reusage นั้นเป็นรูปแบบการเข้ารหัสที่ไม่ดี นอกจากนี้defการที่
Bachsau

0

อีกวิธีคือด้วย Ellipsis:

def foo():
    ...

ไม่ดีไปกว่าการตั้งชื่อวัตถุอื่น ๆ นอกจากนี้คุณยังสามารถเขียนNone, หรือ136 "NothingHere"แต่ fillgap passที่ถูกต้องในหลามเป็น
Bachsau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.