จัดแต่งทรงผมแบบหลายเงื่อนไขในงบ 'ถ้า'? [ปิด]


677

บางครั้งฉันแบ่งเงื่อนไขที่ยาวifเป็นหลายบรรทัด วิธีที่ชัดเจนที่สุดในการทำเช่นนี้คือ:

  if (cond1 == 'val1' and cond2 == 'val2' and
      cond3 == 'val3' and cond4 == 'val4'):
      do_something

ไม่ดึงดูดสายตามากนักเพราะการกระทำนั้นกลมกลืนกับเงื่อนไข อย่างไรก็ตามเป็นวิธีที่เป็นธรรมชาติโดยใช้การย่อหน้า Python ที่ถูกต้องจำนวน 4 ช่อง

สำหรับช่วงเวลาที่ฉันใช้:

  if (    cond1 == 'val1' and cond2 == 'val2' and
          cond3 == 'val3' and cond4 == 'val4'):
      do_something

แต่นี่ไม่สวยมาก :-)

คุณสามารถแนะนำวิธีอื่นได้ไหม?


2
หากโปรแกรมแก้ไขของคุณใช้แพ็คเกจ pep8 Python เพื่อตรวจจับเมื่อมีการเตือนเกี่ยวกับการละเมิดPEP8คุณจะต้องปิดใช้งานข้อผิดพลาด E125 หรือค้นหาวิธีการจัดรูปแบบที่สอดคล้องกับpep8เกณฑ์ของแพ็คเกจ pep8แพคเกจรุ่น # 126เป็นเรื่องเกี่ยวกับการแก้ไขแพคเกจที่จะปฏิบัติตามอย่างเคร่งครัดข้อมูลจำเพาะ PEP8 การสนทนาสำหรับปัญหารวมถึงคำแนะนำสไตล์ที่เห็นที่นี่
akaihola

1
โปรดทราบว่าสำหรับตัวอย่างแรก pep8 จะขว้าง "E129 การเยื้องบรรทัดที่มองเห็นพร้อมกับเยื้องเหมือนกับโลจิคัลบรรทัดถัดไป"
Taylor Edmiston

คำถามนี้เก่ามากและมีมุมมองมากมาย แต่เป็นไปตามความเห็นที่ชัดเจน ภาษา "ไม่น่าดึงดูดมาก" และ "ไม่น่ารักมาก" วางหลักเกณฑ์ที่คำตอบที่ถูกต้องที่คาดคะเนคือคำตอบที่ดีที่สุดที่สอดคล้องกับการตั้งค่าสุนทรียะของผู้ถาม (เช่นความเห็น) ฉันสามารถถามคำถามเดียวกันอย่างแน่นอนและอ้างว่ามันไม่ซ้ำกันเพราะรสนิยมความงามของฉันมีคุณสมบัติที่แตกต่างกันและจะนำไปสู่คำตอบ "ถูก" ที่แตกต่างกัน
ชั้น Z4

@ ระดับ Z4: ใช่มันเป็นไปตามความคิดเห็น แต่มันถูกถามเมื่อ 12 ปีก่อน ดังนั้นที่แตกต่างกันเมตตากลับมาแล้ว เมื่อไม่นานมานี้มีการสะสม downvotes เนื่องจากมาตรฐานของ SO เปลี่ยนแปลงไป ถึงกระนั้นเมื่อได้รับการดู> 1 ล้านครั้งฉันหวังว่ามันจะทำได้ดีกว่าอันตรายในโลกนี้ แน่นอนฉันสามารถเห็นผู้คนสงสัยเกี่ยวกับคำถามเดียวกันในวันนี้ Googling เชื่อมโยงไปถึงการสนทนานี้และพบว่ามีประโยชน์ในการปรับความคิดของพวกเขา มีคำตอบให้เลือกมากมาย
Eli Bendersky

@EliBendersky เห็นด้วยอย่างสมบูรณ์ มันเป็นเช่นนั้นมีวิกฤตเอกลักษณ์อย่างต่อเนื่อง: ในขณะที่มันไม่เหมาะกับ "กฎ" (จำนวนคำตอบที่ถูกต้องเป็นข้อพิสูจน์ถึงนั้น) มันก็ชัดเจนว่าจะเพิ่มมูลค่า ทุกสิ่งเท่าเทียมกันฉันอยากจะทำงานกับคนที่พัฒนามุมมองที่ชัดเจนและมีเหตุผลในการเขียนโค้ดแม้ว่าความคิดเห็นของพวกเขาจะแตกต่างจากของฉัน
Z4 เทียร์

คำตอบ:


750

คุณไม่จำเป็นต้องใช้ช่องว่าง 4 ช่องบนบรรทัดที่มีเงื่อนไขที่สองของคุณ อาจจะใช้:

if (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

นอกจากนี้อย่าลืมช่องว่างที่ยืดหยุ่นกว่าที่คุณคิด:

if (   
       cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something
if    (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

ทั้งสองอย่างนั้นค่อนข้างน่าเกลียด

อาจสูญเสียวงเล็บเหลี่ยม ( Style Guideไม่สนับสนุนสิ่งนี้)?

if cond1 == 'val1' and cond2 == 'val2' and \
   cond3 == 'val3' and cond4 == 'val4':
    do_something

อย่างน้อยก็ให้ความแตกต่างกับคุณ

หรือแม้กระทั่ง:

if cond1 == 'val1' and cond2 == 'val2' and \
                       cond3 == 'val3' and \
                       cond4 == 'val4':
    do_something

ฉันคิดว่าฉันชอบ:

if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something

นี่คือStyle Guideซึ่ง (ตั้งแต่ปี 2010) แนะนำให้ใช้เครื่องหมายวงเล็บ


45
โปรดทราบว่าไม่แนะนำให้ใช้การต่อท้าย \ solutions โดย PEP 8 เหตุผลหนึ่งคือหากเพิ่มช่องว่างโดยไม่ได้ตั้งใจหลังจากที่ \ มันอาจไม่แสดงในตัวแก้ไขของคุณและรหัสจะไม่ถูกต้องทางวากยสัมพันธ์
Eric O Lebigot

14
นี่เป็นสิ่งผิดคู่มือสไตล์บอกว่า "เส้นยาวสามารถแบ่งได้หลายบรรทัดโดยการห่อนิพจน์ในวงเล็บควรใช้สิ่งเหล่านี้ในการตั้งค่าเพื่อใช้แบ็กสแลชเพื่อการต่อเนื่องของบรรทัด" คุณสามารถดูได้ที่นี่: python.org/dev/peps/pep-0008/#maximum-line-length
joshcartme

8
@joshcartme PEP เปลี่ยนไปที่hg.python.org/peps/rev/7a48207aaab6เพื่อกีดกันแบ็กสแลชอย่างชัดเจน ฉันจะอัปเดตคำตอบ
Harley Holcombe

3
ขอบคุณอาจเป็นความคิดที่ดีที่จะอัปเดตตัวอย่างของคุณเนื่องจากไม่แนะนำให้ทำเช่นนี้ ฉันพยายามคิดออกเองและสับสนกับความแตกต่างระหว่างคำตอบของคุณกับไกด์นำเที่ยว ฉันไม่เพียง แต่พยายามอวดความสามารถ
joshcartme

3
PEP 8ตอนนี้อุปสรรคที่จะหมดหลังandและifได้เป็นอย่างดี
virtualxtc

124

ฉันใช้วิธีต่อไปนี้ในกรณีที่ความเสื่อมโทรมซึ่งเป็นเพียงแค่ AND และหรือ OR

if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

มันโกนอักขระสองสามตัวและทำให้ชัดเจนว่าไม่มีความละเอียดอ่อนตามเงื่อนไข


4
นี่เป็นวิธีการที่น่าสนใจ ไม่ได้แก้ไขปัญหาเรื่องเงื่อนไขที่ยาวนาน
Eli Bendersky

20
มันก็โอเคถ้าคุณไม่สนใจเรื่องการลัดวงจร
Constantin

63
การทำให้สั้นลงนั้นไม่ได้รวดเร็วเสมอไป if destroy_world and DestroyTheWorld() == world_is_destroyed: ...ในขณะที่ไม่ดีการเข้ารหัสการปฏิบัติคุณอาจจะมีรหัสที่มีอยู่เช่นนี้ เยี่ยมมากตอนนี้คุณเพิ่งทำลายโลกนี้โดยบังเอิญ ทำไมคุณถึงได้?
Aaron

4
ฉันประหลาดใจที่นี่มี upvotes มากมาย คำตอบนี้จะไม่สนใจคำถามเดิมเกี่ยวกับการจัดแต่งทรงผมแบบหลายบรรทัดอย่างสมบูรณ์
Przemek D

2
การแสดงออกนี้ไม่ได้ขี้เกียจ ดังนั้นจึงไม่เทียบเท่าหากมีเงื่อนไขการป้องกันบางอย่างที่อาจตามมาได้
eugene-bright

57

ใครบางคนต้องชนะการใช้พื้นที่สีขาวในแนวตั้งที่นี่! :)

if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()

ทำให้แต่ละเงื่อนไขมองเห็นได้ชัดเจน นอกจากนี้ยังช่วยให้การแสดงออกที่สะอาดขึ้นของเงื่อนไขที่ซับซ้อนมากขึ้น:

if (    cond1 == val1
     or 
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()

ใช่เราทำการค้าอสังหาริมทรัพย์แนวดิ่งเพื่อความชัดเจน คุ้มค่ากับมัน IMO


19
ดูเหมือนว่าจะไม่สวยงามหรือไม่รองรับ PEP8 PEP8 บอกว่าสถานที่ที่ต้องการแบ่งเป็นตัวดำเนินการไบนารี (เช่นandและor) คือหลังจากตัวดำเนินการไม่ใช่ก่อนหน้านี้
Chris Medrela

7
@ChristopherMedrela มันบอกเหตุผลเบื้องหลังไหม? ฉันคิดว่าการวางเส้นแบ่งไว้ก่อนที่ตัวดำเนินการเชิงตรรกะจะชัดเจนมากขึ้น
Norill Tempest

4
การวาง oprerator ก่อนเป็นเรื่องธรรมดาในโลกของโหนด เหตุผลก็คือเราสังเกตเห็นและอ่านสิ่งที่อยู่ทางซ้ายเร็วกว่าของสิ่งที่อยู่ทางขวาอย่างน้อยในวัฒนธรรมตะวันตก ถูกต้องมากใน JavaScript โดยที่เครื่องหมายจุลภาคที่ถูกลืมสามารถทำให้เกิดข้อผิดพลาดแบบเงียบได้
tomekwi

11
โปรดอย่าทำเช่นนี้ ไม่เพียง แต่ไม่เพียงPEP8แต่ทำให้ยากต่อการพิจารณาการดำเนินการทางตรรกะที่คุณผูกพันด้วย ฉันจะล้มเหลวถ้ามันมาถึงโต๊ะของฉันผ่านการตรวจสอบรหัส
Urda

11
ตั้งแต่เวอร์ชันปัจจุบันของ PEP8 การแบ่งก่อนหรือหลังตัวดำเนินการไบนารีถือว่ายอมรับได้และก่อนที่ตัวดำเนินการจะถือว่าดีกว่าสำหรับรหัสใหม่
Soren Bjornstad

31

ฉันชอบสไตล์นี้เมื่อฉันมีขนาดใหญ่มากถ้าเงื่อนไข:

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status=="HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()

2
+1 สำหรับเก็บการเยื้องที่คุณสามารถติดตามได้ ฉันชอบงูใหญ่และใช้มันเยอะ แต่ฉันรำคาญอยู่ตลอดเวลาโดยถูกบังคับให้เยื้อง หลายสายถ้าทำลายความงามได้จริงแม้จะทำได้ดีก็ตาม
อันยิ่งใหญ่

4
โปรดทราบว่าการที่คุณandและorผู้ประกอบการที่จุดเริ่มต้นของบรรทัดละเมิดPEP 0008ซึ่งระบุว่า"สถานที่ที่ต้องการทำลายผู้ดำเนินการไบนารีคือหลังจากผู้ดำเนินการไม่ใช่ก่อนหน้า" . ฉันชอบที่มีวงเล็บปิดและโคลอนในบรรทัดของตัวเองเพื่อแยกเงื่อนไขถ้าออกจากร่างกายแม้ว่า (และเป็นไปได้อย่างสมบูรณ์ที่จะทำเช่นนี้ในขณะที่รักษาผู้ให้บริการบูลีนของคุณไว้ที่ท้ายบรรทัดเพื่อให้สอดคล้องกับ PEP-0008)
Mark Amery

8
ณ วันที่ 2016: For decades the recommended style was to break after binary operators. But this can hurt readability in two ways... In Python code, it is permissible to break before or after a binary operator, as long as the convention is consistent locally. For new code Knuth's style is suggested.(สไตล์ของ Knuth เริ่มต้นจากผู้ให้บริการ)
cowbert

27

ต่อไปนี้เป็นเรื่องส่วนตัวของฉันมาก: เงื่อนไขระยะยาวคือ (ในมุมมองของฉัน) กลิ่นรหัสที่แสดงให้เห็นการปรับสภาพให้เป็นฟังก์ชั่น / วิธีการบูลีนที่กลับมา ตัวอย่างเช่น:

def is_action__required(...):
    return (cond1 == 'val1' and cond2 == 'val2'
            and cond3 == 'val3' and cond4 == 'val4')

ตอนนี้ถ้าฉันพบวิธีที่จะทำให้เงื่อนไขหลายบรรทัดดูดีฉันอาจพบว่าตัวเองพอใจที่มีพวกเขาและข้ามการปรับโครงสร้างใหม่

ในทางกลับกันการมีพวกเขารบกวนความงามของฉันทำหน้าที่เป็นแรงจูงใจในการปรับโครงสร้าง

ข้อสรุปของฉันคือเงื่อนไขที่มีหลายบรรทัดควรดูน่าเกลียดและนี่คือสิ่งจูงใจที่จะหลีกเลี่ยงพวกเขา


23

มันไม่ได้ปรับปรุงอะไรมากมาย แต่ ...

allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and
                 cond3 == 'val3' and cond4 == 'val4')

if allCondsAreOK:
   do_something

1
ทางเลือกที่น่าสนใจ แต่ 2 บรรทัดพิเศษ :-)
Eli Bendersky

wouldnt ทำงานได้ดีในวงวนซ้ำ, wouldnt ทำงานกับฟังก์ชั่นการทำอะไรบางอย่าง ... และเป็นธรรม - น่าเกลียด
Mez

9
ไบรอันฉันไม่เห็นด้วยบางส่วน การใช้ตัวแปรสำหรับผลลัพธ์ระดับกลางของการคำนวณสามารถทำให้เข้าใจรหัสได้ง่ายขึ้นและในภาษาที่คอมไพล์แล้วจะไม่มีผลกระทบต่อประสิทธิภาพการทำงาน มันอาจจะทำในงูหลามแม้ว่าฉันจะไม่ใช้งูหลามเลยก็ตามถ้าน้ำหอมเป็นสิ่งสำคัญ
Mark Baker

1
@ MarkBaker ฉันเคยเห็นด้วยกับสิ่งที่คุณเขียนจนกระทั่งฉันอ่าน Martin Fowlers "Refactoring" เขาให้ข้อโต้แย้งที่ยอดเยี่ยมว่าตัวแปรกลางดังกล่าวก่อให้เกิดอันตรายมากกว่าผลประโยชน์ พวกเขายับยั้ง refactoring ตามมา การทำโดยที่ไม่มีพวกมันจะนำไปสู่รูปแบบการเขียนโปรแกรมที่ใช้งานได้ดีกว่า สิ่งนี้ทำให้ฉันประหลาดใจ แต่ฉันเชื่อว่าเขาพูดถูกและมีความพยายามอย่างยิ่งที่จะกำจัดคนกลางที่ไม่มีความจำเป็นเช่นนี้จากรหัสของฉัน - แม้ว่าพวกเขาจะใช้มากกว่าหนึ่งครั้งก็ตาม
Jonathan Hartley

2
ดี แต่ทำไมต้องเป็น camelCase! :)
Leonid Shvechikov

19

ฉันขอแนะนำให้ย้ายandคำหลักไปยังบรรทัดที่สองและเยื้องบรรทัดทั้งหมดที่มีเงื่อนไขด้วยช่องว่างสองช่องแทนที่จะเป็นสี่:

if (cond1 == 'val1' and cond2 == 'val2'
  and cond3 == 'val3' and cond4 == 'val4'):
    do_something

นี่คือวิธีที่ฉันแก้ปัญหานี้ในรหัสของฉัน การมีคำหลักเป็นคำแรกในบรรทัดทำให้เงื่อนไขอ่านได้ง่ายขึ้นมากและการลดจำนวนช่องว่างทำให้เงื่อนไขแตกต่างจากการกระทำ


9
ฉันอ่านที่ใดที่หนึ่งใน Gries หรือ Djikstra ที่วางตัวดำเนินการทางตรรกะไว้ที่ด้านหน้าของบรรทัด และฉันทำอย่างนั้นมาตั้งแต่ยุค 90 และมันก็ช่วย
S.Lott

7
โปรดทราบว่า Style Guide แนะนำให้ใส่เงื่อนไขไว้ท้ายบรรทัด
Harley Holcombe

3
นั่นเป็นความจริงแม้ว่าฉันจะไม่เคยเห็นด้วยกับสิ่งนี้ มันเป็นเพียงแนวทางเท่านั้น
DzinX

8
PEP8 ไม่แนะนำให้ใส่เงื่อนไขที่ท้ายบรรทัดอีกต่อไป
Soren Bjornstad

14

ดูเหมือนว่าน่าจะอ้างข้อความPEP 0008 (คู่มือแบบเป็นทางการของ Python) เนื่องจากมันให้ความเห็นเกี่ยวกับปัญหานี้อย่างพอประมาณ

เมื่อส่วนที่มีเงื่อนไขของ - คำสั่งifยาวพอที่จะให้มันเขียนข้ามหลายบรรทัดมันก็น่าสังเกตว่าการรวมกันของคำสำคัญสองตัวอักษร (เช่นif) บวกช่องว่างเดียวและวงเล็บเปิดสร้างธรรมชาติ 4- เยื้องพื้นที่สำหรับบรรทัดต่อมาของเงื่อนไขหลายบรรทัด สิ่งนี้สามารถสร้างความขัดแย้งที่มองเห็นได้ด้วยชุดของการเยื้องของรหัสที่ซ้อนกันภายใน - สถานะifซึ่งจะเป็นการเยื้องตามธรรมชาติถึง 4 ช่องว่าง PEP นี้จะใช้เวลาไม่มีตำแหน่งอย่างชัดเจนเกี่ยวกับวิธีการ (หรือว่า) เพื่อการมองเห็นความแตกต่างของสายตามเงื่อนไขดังกล่าวจากชุดที่ซ้อนกันภายในif-statement ตัวเลือกที่ยอมรับได้ในสถานการณ์นี้รวมถึง แต่ไม่ จำกัด เพียง:

# No extra indentation.
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

หมายเหตุ "ไม่ จำกัด เฉพาะ" ในเครื่องหมายคำพูดด้านบน นอกเหนือจากแนวทางที่แนะนำในคู่มือแนะนำสไตล์แล้วแนวทางที่แนะนำในคำตอบอื่น ๆ สำหรับคำถามนี้ก็เป็นที่ยอมรับเช่นกัน


+1 สำหรับ PEP8 สิ่งนี้ควรได้รับการยอมรับเนื่องจากเป็นแนวทางในการใช้งาน Python อย่างเป็นทางการ
ไมเคิล - Clay Shirky ของ

2
นอกจากนี้ยังมีการเน้นย้ำว่า PEP8 ระบุจุดยืนอย่างชัดเจนเนื่องจากPEP นี้ไม่ใช้ตำแหน่งที่ชัดเจนว่า (หรือไม่) เพื่อแยกความแตกต่างของบรรทัดที่มีเงื่อนไขดังกล่าวออกจากชุดที่ซ้อนกันภายในถ้า - สถานะ ตัวเลือกที่ยอมรับได้ในสถานการณ์นี้รวมถึง แต่ไม่ จำกัด เพียง: ... (snipped) ดังนั้นหยุดเถียงเถอะไปกับสิ่งที่คุณชอบ!
RayLuo

7

นี่คือสิ่งที่ฉันทำโปรดจำไว้ว่า "ทั้งหมด" และ "ใด ๆ " ยอมรับการทำซ้ำดังนั้นฉันจึงใส่เงื่อนไขที่ยาวในรายการและปล่อยให้ "ทั้งหมด" ทำงาน

condition = [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']

if all(condition):
   do_something

4

ฉันประหลาดใจที่ไม่เห็นโซลูชันที่ฉันต้องการ

if (cond1 == 'val1' and cond2 == 'val2'
    and cond3 == 'val3' and cond4 == 'val4'):
    do_something

เนื่องจากandเป็นคำหลักจึงได้รับการเน้นโดยบรรณาธิการของฉันและดูแตกต่างจาก do_something ด้านล่าง


แต่บรรทัดต่อเนื่องยังคงไม่แตกต่างจากบรรทัดต่อไปตรรกะ ...
คริส Medrela

1
โปรดทราบว่านี่เป็นการละเมิด PEP 0008 ( "สถานที่ที่ต้องการทำลายผู้ประกอบการแบบไบนารีคือหลังจากผู้ดำเนินการไม่ใช่ก่อนหน้านี้" ) ไม่ว่าคุณจะสนใจแน่นอนขึ้นอยู่กับคุณ
Mark Amery

1
อนึ่งนี่ไม่ใช่โซลูชันที่ฉันต้องการอีกต่อไป ;)
Marius Gedminas

4

การเพิ่มในสิ่งที่ @krawyoti พูด ... กลิ่นที่ยาวนานเพราะยากต่อการอ่านและยากที่จะเข้าใจ การใช้ฟังก์ชั่นหรือตัวแปรทำให้รหัสชัดเจนขึ้น ใน Python ฉันต้องการใช้พื้นที่แนวตั้งล้อมรอบวงเล็บและวางตัวดำเนินการเชิงตรรกะที่จุดเริ่มต้นของแต่ละบรรทัดเพื่อให้นิพจน์ไม่เหมือน "floating"

conditions_met = (
    cond1 == 'val1' 
    and cond2 == 'val2' 
    and cond3 == 'val3' 
    and cond4 == 'val4'
    )
if conditions_met:
    do_something

หากเงื่อนไขต้องได้รับการประเมินมากกว่าหนึ่งครั้งเช่นเดียวกับการwhileวนซ้ำการใช้ฟังก์ชั่นท้องถิ่นจะดีที่สุด


1
นอกจากนี้คุณยังสามารถประกาศฟังก์ชั่นหรือแลมบ์ดาเพื่อคืนค่าเท็จที่แท้จริงของคุณซึ่งตรงข้ามกับการสร้างตัวแปรเพิ่มเติม
Techdragon

@Techdragon หากมีเงื่อนไขอื่น ๆ จากนั้นใส่ลงในบล็อกแลมบ์ดาจะต้องมีการตั้งชื่อบล็อกแลมบ์ดาเพื่อให้สามารถอ้างอิงได้ในภายหลังหากเงื่อนไข หากแลมบ์ดาจะถูกตั้งชื่อทำไมมันไม่ฟังก์ชั่นปกติหลังจากทั้งหมด? ฉันชอบการแสดงออกแบบบูลที่ลดลงนี้เป็นการส่วนตัว
Sri Kadimisetty

ฉันเห็นด้วยซึ่งเป็นเหตุผลที่ปกติฉันจะใช้ฟังก์ชั่นในกรณีส่วนใหญ่สำหรับทั้งการปรับปรุงการอ่านและความสะดวกในการย่อยทางจิตเมื่อ skimming เพื่อทำความเข้าใจการควบคุมโปรแกรม ฉันพูดถึงแลมบ์ดาเพื่อให้แน่ใจว่าตัวเลือก 'เล็ก' นั้นก็มีอยู่ในกรณีที่ผู้คนใส่ใจในพื้นที่
Techdragon

4

ส่วนตัวผมชอบที่จะเพิ่มความหมายให้กับงบยาว ฉันจะต้องค้นหารหัสเพื่อค้นหาตัวอย่างที่เหมาะสม แต่นี่เป็นตัวอย่างแรกที่นึกได้: สมมติว่าฉันเกิดปัญหาตรรกะบางอย่างที่ฉันต้องการแสดงหน้าบางอย่างขึ้นอยู่กับตัวแปรหลายตัว

ภาษาอังกฤษ: "ถ้าผู้ใช้ที่เข้าสู่ระบบไม่ใช่อาจารย์ผู้ดูแลระบบ แต่เป็นเพียงครูประจำและไม่ใช่นักเรียนเอง ... "

if not user.isAdmin() and user.isTeacher() and not user.isStudent():
    doSomething()

แน่นอนว่านี่อาจดูดี แต่การอ่านหากคำสั่งทำงานหนักมาก วิธีการเกี่ยวกับเรากำหนดตรรกะเพื่อฉลากที่เหมาะสม "label" เป็นชื่อตัวแปรจริง:

displayTeacherPanel = not user.isAdmin() and user.isTeacher() and not user.isStudent()
if displayTeacherPanel:
    showTeacherPanel()

สิ่งนี้อาจดูงี่เง่า แต่คุณอาจมีเงื่อนไขอื่นที่คุณต้องการแสดงรายการอื่นเฉพาะในกรณีที่คุณแสดงพาเนลครูหรือหากผู้ใช้มีการเข้าถึงพาเนลเฉพาะอื่น ๆ ตามค่าเริ่มต้น:

if displayTeacherPanel or user.canSeeSpecialPanel():
    showSpecialPanel()

ลองเขียนเงื่อนไขข้างต้นโดยไม่ใช้ตัวแปรในการจัดเก็บและติดฉลากตรรกะของคุณและไม่เพียง แต่คุณจะจบลงด้วยคำสั่งทางตรรกะที่ยุ่งเหยิงและอ่านยาก แต่คุณก็ต้องทำซ้ำด้วยตัวเอง ในขณะที่มีข้อยกเว้นที่สมเหตุสมผลโปรดจำไว้ว่า: อย่าทำซ้ำตัวเอง (DRY)


3

"ทั้งหมด" และ "ใด ๆ " เป็นสิ่งที่ดีสำหรับเงื่อนไขประเภทเดียวกันหลายกรณี แต่พวกเขามักจะประเมินเงื่อนไขทั้งหมด ดังที่แสดงในตัวอย่างนี้:

def c1():
    print " Executed c1"
    return False
def c2():
    print " Executed c2"
    return False


print "simple and (aborts early!)"
if c1() and c2():
    pass

print

print "all (executes all :( )"
if all((c1(),c2())):
    pass

print

5
! ที่ไม่ถูกต้อง พวกเขาทำเพราะคุณทำเท่านั้น ลองทั้งหมด (f () สำหรับ f ใน [c1, c2])
habnabit

2
ฉันคิดว่าเขาใช้ฟังก์ชั่นเป็นเพียงตัวอย่างเท่านั้นเพราะเขาสามารถทำให้มันพิมพ์ได้อย่างง่ายดาย หากเรากำลังพิจารณาชุดของการแสดงออกโดยพลการที่ให้ไว้ในรายการall()แล้วเว้นแต่ว่าคุณจะห่อมันไว้ในแลมบ์ดาและใช้f()เคล็ดลับของคุณพวกเขาทั้งหมดจะได้รับการประเมิน ในคำอื่น ๆ Aaron: ฉันคิดว่า Anders พยายามพูดคุยเกี่ยวกับเงื่อนไขโดยทั่วไปโดยใช้ callables เป็นตัวอย่างเฉพาะ แต่การตอบกลับของคุณใช้กับฟังก์ชั่นเท่านั้น
แบรนดอนโรดส์

3

(ฉันได้ปรับเปลี่ยนตัวระบุเล็กน้อยเป็นชื่อที่มีความกว้างคงที่ไม่ใช่ตัวแทนของรหัสจริง - อย่างน้อยก็ไม่ใช่รหัสจริงที่ฉันพบ - และจะปฏิเสธการอ่านตัวอย่าง)

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4"):
    do_something

สิ่งนี้ใช้ได้ดีสำหรับ "และ" และ "หรือ" (เป็นสิ่งสำคัญที่จะต้องอยู่ในบรรทัดที่สองเป็นอันดับแรก) แต่ก็น้อยกว่ามากสำหรับเงื่อนไขที่ยาวนานอื่น ๆ โชคดีที่อดีตดูเหมือนจะเป็นกรณีทั่วไปมากขึ้นในขณะที่หลังมักจะเขียนใหม่ได้อย่างง่ายดายด้วยตัวแปรชั่วคราว (โดยทั่วไปจะไม่ยาก แต่อาจเป็นเรื่องยากหรือชัดเจนน้อยกว่า / อ่านได้เพื่อรักษาการลัดวงจรของ "และ" / "หรือ" เมื่อเขียนใหม่)

เนื่องจากฉันพบคำถามนี้จากการโพสต์บล็อกของคุณเกี่ยวกับ C ++ฉันจะระบุว่าสไตล์ C ++ ของฉันเหมือนกัน:

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4") {
    do_something
}

3

ธรรมดาและเรียบง่ายผ่านการตรวจสอบ pep8 ด้วย:

if (
    cond1 and
    cond2
):
    print("Hello World!")

ในครั้งล่าสุดที่ฉันได้รับการเลือกallและanyฟังก์ชั่นเนื่องจากฉันไม่ค่อยผสมและและหรือเปรียบเทียบการทำงานนี้ได้ดีและมีข้อได้เปรียบเพิ่มเติมของความล้มเหลวในช่วงต้นด้วยความเข้าใจกำเนิด:

if all([
    cond1,
    cond2,
]):
    print("Hello World!")

เพียงจำไว้ว่าให้ส่งผ่าน iterable เดียว! การส่งผ่านอาร์กิวเมนต์ N ไม่ถูกต้อง

หมายเหตุ: anyเหมือนorการเปรียบเทียบหลาย ๆครั้งallเหมือนกับandการเปรียบเทียบหลาย ๆครั้ง


สิ่งนี้รวมเข้ากับความเข้าใจของเครื่องกำเนิดไฟฟ้าได้เป็นอย่างดี:

# Check if every string in a list contains a substring:
my_list = [
    'a substring is like a string', 
    'another substring'
]

if all('substring' in item for item in my_list):
   print("Hello World!")

# or

if all(
    'substring' in item
    for item in my_list
):
    print("Hello World!")

เพิ่มเติมเกี่ยวกับ: ความเข้าใจกำเนิด


1
ฉันควรชี้ให้เห็นว่าการกำหนดค่าหุ้นของ pylint ต้องการการเยื้องในการต่อเนื่องของบรรทัดใน if; ซึ่งทำให้ฉันไม่สามารถใช้รูปแบบนี้ได้
ThorSummoner

2

ถ้าเราแทรกบรรทัดว่างเพิ่มเติมระหว่างเงื่อนไขและร่างกายและทำส่วนที่เหลือตามวิธีมาตรฐาน

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):

    do_something

ปล. ฉันมักจะใช้แท็บไม่ใช่ที่ว่าง ฉันไม่สามารถปรับแต่ง ...


3
มันจะสับสนมากโดยเฉพาะอย่างยิ่งเมื่อร่างกายของเงื่อนไขมีความยาวฉันคิดว่า
Eli Bendersky

ฉันเห็นด้วยกับอีไลการห่อหุ้มและการเยื้องที่นี่ทำให้เกิดความสับสนสำหรับสายยาว ยิ่งไปกว่านั้นกฎใหม่ก็คือคำสั่งandและorข้อความควรเริ่มต้นในบรรทัดถัดไป
virtualxtc

2

สิ่งที่ฉันมักจะทำคือ:

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something

วิธีนี้วงเล็บปีกกาปิดและเครื่องหมายโคลอนจะทำเครื่องหมายจุดสิ้นสุดของสภาพของเรา


1
เกือบถูกต้องแล้ว PEP 8นี้แนะนำทำลายก่อนหรือand or
virtualxtc

2

ผู้ตอบแบบสอบถามทั้งหมดที่มีเงื่อนไขแบบหลายเงื่อนไขสำหรับคำสั่ง if นั้นน่าเกลียดพอ ๆ กับปัญหาที่เกิดขึ้น คุณไม่ได้แก้ปัญหานี้ด้วยการทำสิ่งเดียวกัน ..

แม้แต่คำตอบ PEP 0008 ก็น่ารังเกียจ

นี่เป็นวิธีที่อ่านได้ง่ายกว่ามาก

condition = random.randint(0, 100) # to demonstrate
anti_conditions = [42, 67, 12]
if condition not in anti_conditions:
    pass

อยากให้ฉันกินคำพูดของฉัน? โน้มน้าวใจฉันว่าคุณต้องมีหลายเงื่อนไขและฉันจะพิมพ์สิ่งนี้และกินมันเพื่อความสนุกของคุณ


นี่เป็นวิธีที่ดีมากในการทำหลายเงื่อนไข :) ไม่รู้ว่าทำไมมันถึงไม่มีเสียงโหวตมากขึ้น :) มีข้อแม้บ้างไหม?
dim_user

@SaulCruz จริงๆแล้วไม่เพียง แต่ตัวแปรเงื่อนไขไม่จำเป็นต้องทำซ้ำคุณยังบันทึกจำนวนซ้ำของการตรวจสอบแต่ละค่าเพียงแค่ใส่ค่าในอาเรย์และปล่อยให้เครื่องยนต์ทำงาน (ปรับให้เหมาะสม) ใน ตรวจสอบเงื่อนไขสำหรับคุณ
Stoff

@Stoff ขอบคุณสำหรับการลบความคิดเห็นของฉัน ฉันต้องการชี้ให้เห็นว่าวิธีการของคุณไม่ตอบคำถามของ OP รหัสที่คุณระบุไม่สามารถนำไปใช้กับรหัสในคำถามได้ หากคุณคิดอย่างอื่นคุณควรเพิ่มรหัสของ OP ที่จัดรูปแบบใหม่โดยวิธีการของคุณเพื่อพิสูจน์ประเด็นของคุณ
Jeyekomon

มันไม่ใช่คำตอบที่ได้รับการยอมรับ แต่มันก็เป็นทางเลือกที่ชัดเจน ดังนั้นสนับสนุนคำตอบทางเลือกดังนั้นอาร์กิวเมนต์คืออะไรกันแน่ ชัดเจนในคำถามของคุณเองอาจพิจารณาเปิดคำถามของคุณเองหากคุณต้องการความสนใจที่เหมาะสม ป.ล. ฉันไม่ได้เป็น mod ดังนั้นฉันไม่สามารถลบความคิดเห็น
Stoff

2

ฉันคิดว่าวิธีการแก้ปัญหาของ @ zkanda น่าจะดีเมื่อมีอาการกระตุกเล็กน้อย หากคุณมีเงื่อนไขและค่าของคุณในรายการของตนเองคุณสามารถใช้รายการความเข้าใจเพื่อทำการเปรียบเทียบซึ่งจะทำให้สิ่งต่าง ๆ เพิ่มขึ้นเล็กน้อยสำหรับการเพิ่มคู่เงื่อนไข / ค่า

conditions = [1, 2, 3, 4]
values = [1, 2, 3, 4]
if all([c==v for c, v in zip(conditions, values)]):
    # do something

ถ้าฉันต้องการรหัสยาก ๆ แบบนี้ฉันจะเขียนแบบนี้เพื่อความชัดเจน:

if (condition1==value1) and (condition2==value2) and \
   (condition3==value3) and (condition4==value4):

และเพียงโยนโซลูชันอื่นออกไปกับiandผู้ปฏิบัติงาน :

proceed = True
for c, v in zip(conditions, values):
    proceed &= c==v

if proceed:
    # do something

1
เพื่อความสนุก: all(map(eq, have, expected)). (พร้อมfrom operator import eq)
Gabriel Garcia

1

เพียงไม่กี่ความคิดแบบสุ่มอื่น ๆ เพื่อประโยชน์ของความสมบูรณ์ หากพวกเขาทำงานให้คุณใช้พวกเขา มิฉะนั้นคุณน่าจะลองทำอย่างอื่นดีกว่า

คุณสามารถทำได้ด้วยพจนานุกรม:

>>> x = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> y = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> x == y
True

ตัวเลือกนี้มีความซับซ้อนมากขึ้น แต่คุณอาจพบว่ามีประโยชน์:

class Klass(object):
    def __init__(self, some_vars):
        #initialize conditions here
    def __nonzero__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
                self.cond3 == 'val3' and self.cond4 == 'val4')

foo = Klass()
if foo:
    print "foo is true!"
else:
    print "foo is false!"

Dunno ถ้ามันเหมาะกับคุณ แต่ก็เป็นอีกทางเลือกที่น่าพิจารณา นี่คืออีกวิธีหนึ่ง:

class Klass(object):
    def __init__(self):
        #initialize conditions here
    def __eq__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
               self.cond3 == 'val3' and self.cond4 == 'val4')

x = Klass(some_values)
y = Klass(some_other_values)
if x == y:
    print 'x == y'
else:
    print 'x!=y'

สองครั้งสุดท้ายที่ฉันยังไม่ได้ทดสอบ แต่แนวคิดควรจะเพียงพอที่จะให้คุณไปถ้านั่นคือสิ่งที่คุณต้องการไปด้วย

(และสำหรับบันทึกถ้านี่เป็นเพียงครั้งเดียวคุณน่าจะดีกว่าโดยใช้วิธีที่คุณนำเสนอในตอนแรกถ้าคุณทำการเปรียบเทียบในหลาย ๆ ที่วิธีการเหล่านี้อาจช่วยให้อ่านง่ายขึ้น คุณไม่รู้สึกแย่เกี่ยวกับความจริงที่ว่าพวกเขาเป็นพวกแฮ็ค)


1

ฉันพยายามดิ้นรนเพื่อหาวิธีที่เหมาะสมในการทำสิ่งนี้เช่นกันดังนั้นฉันจึงเกิดความคิดขึ้น (ไม่ใช่กระสุนเงินเพราะนี่เป็นเรื่องของรสนิยม)

if bool(condition1 and
        condition2 and
        ...
        conditionN):
    foo()
    bar()

ฉันพบข้อดีสองสามอย่างในวิธีนี้เทียบกับคนอื่นที่ฉันเคยเห็นนั่นคือคุณจะได้รับการเยื้องพิเศษ (bool) 4 ช่องซึ่งช่วยให้ทุกเงื่อนไขเรียงตัวในแนวตั้งและเนื้อหาของคำสั่ง if สามารถเยื้องใน วิธีที่ชัดเจน (ish) สิ่งนี้ยังคงประโยชน์ของการประเมินการลัดวงจรของตัวดำเนินการบูลีน แต่แน่นอนว่าเป็นการเพิ่มค่าใช้จ่ายในการเรียกใช้ฟังก์ชันที่โดยทั่วไปไม่ได้ทำอะไรเลย คุณสามารถโต้แย้ง (ถูกต้อง) ว่าฟังก์ชันใด ๆ ที่ส่งคืนอาร์กิวเมนต์สามารถใช้ที่นี่แทนบูลได้ แต่อย่างที่ฉันพูดมันเป็นเพียงแนวคิดและท้ายที่สุดมันก็เป็นเรื่องของรสนิยม

ตลกพอที่ฉันเขียนเรื่องนี้และคิดเกี่ยวกับ "ปัญหา" ฉันจึงคิดอีกแนวคิดหนึ่งซึ่งจะเอาค่าใช้จ่ายของการเรียกฟังก์ชัน ทำไมไม่ระบุว่าเรากำลังจะเข้าสู่เงื่อนไขที่ซับซ้อนโดยใช้วงเล็บคู่พิเศษ บอกเด็กอีก 2 คนว่าให้เว้นวรรค 2 อันของเงื่อนไขย่อยที่สัมพันธ์กับเนื้อความของคำสั่ง if ตัวอย่าง:

if (((foo and
      bar and
      frob and
      ninja_bear))):
    do_stuff()

ฉันเป็นเช่นนี้เพราะเมื่อคุณดูมันระฆังจะดังขึ้นทันทีในหัวของคุณและพูดว่า"เฮ้มีสิ่งที่ซับซ้อนเกิดขึ้นที่นี่!" . ใช่ฉันรู้ว่าวงเล็บไม่ช่วยให้สามารถอ่านได้ แต่เงื่อนไขเหล่านี้ควรปรากฏขึ้นไม่บ่อยนักและเมื่อมันปรากฏขึ้นคุณจะต้องหยุดและอ่านอย่างระมัดระวังอยู่ดี (เพราะมันซับซ้อน )

อย่างไรก็ตามข้อเสนออีกสองข้อที่ฉันไม่ได้เห็นที่นี่ หวังว่าจะช่วยให้ใครบางคน :)


1

คุณสามารถแบ่งมันเป็นสองบรรทัด

total = cond1 == 'val' and cond2 == 'val2' and cond3 == 'val3' and cond4 == val4
if total:
    do_something()

หรือแม้กระทั่งเพิ่มเงื่อนไขหนึ่งครั้ง ifวิธีการที่อย่างน้อยก็แยกถ่วงจาก


1

ฉันรู้ว่าชุดข้อความนี้เก่า แต่ฉันมีรหัส Python 2.7 บางส่วนและ PyCharm (4.5) ยังคงบ่นเกี่ยวกับกรณีนี้:

if foo is not None:
    if (cond1 == 'val1' and cond2 == 'val2' and
        cond3 == 'val3' and cond4 == 'val4'):
            # some comment about do_something
            do_something

แม้ว่าจะมีคำเตือน PEP8 "บรรทัดที่มีการเยื้องทางสายตาที่มีการเยื้องเหมือนกับบรรทัดตรรกะถัดไป" แต่รหัสจริงก็โอเคอย่างสมบูรณ์? ไม่ใช่ "การเยื้องมากเกินไป"

... มีบางครั้งที่ฉันหวังว่าหลามจะทำให้กระสุนปืนหายไปและใช้เครื่องมือจัดฟันแบบหยิก ฉันสงสัยว่ามีข้อผิดพลาดเกิดขึ้นกี่ครั้งในช่วงหลายปีที่ผ่านมาเนื่องจากการเยื้องโดยไม่ตั้งใจ ...


0

บรรจุเงื่อนไขของคุณลงในรายการแล้วทำ smth ชอบ:

if False not in Conditions:
    do_something

0

ฉันพบว่าเมื่อฉันมีเงื่อนไขที่ยาวนานฉันมักจะมีรหัสสั้น ๆ ในกรณีนั้นฉันแค่เยื้องร่างสองส่วนดังนี้:

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):
        do_something

1
@qarma คุณจะสนใจที่จะขยายหรือไม่ มันดีกว่าการใช้ตัวอักษรต่อเนื่องบรรทัดที่แนะนำโดย PEP 8
xorsyst

นี่เป็นกรณีที่ถูกต้องสำหรับความต่อเนื่องของบรรทัด วงเล็บ IMPO มีความหมายว่าทูเปิลหรือการเรียกใช้ฟังก์ชัน การใช้ OP เป็นแบบ C มากฉันชอบไวยากรณ์ของหลามทุกครั้งที่ทำได้ ฉันยอมรับว่า \ ไม่ได้รับความนิยมในระดับสากล
Dima Tisnek

0
  if cond1 == 'val1' and \
     cond2 == 'val2' and \
     cond3 == 'val3' and \
     cond4 == 'val4':
      do_something

หรือถ้านี่ชัดเจนขึ้น:

  if cond1 == 'val1'\
     and cond2 == 'val2'\
     and cond3 == 'val3'\
     and cond4 == 'val4':
      do_something

ไม่มีเหตุผลที่เยื้องควรเป็นทวีคูณของ 4 ในกรณีนี้เช่นดู "จัดชิดกับตัวคั่นเปิด":

http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Indentation#Indentation


คำแนะนำของ Google ยังแสดงตัวอย่างของเงื่อนไขที่ซับซ้อนซึ่งตรงกับ“ วิธีที่ชัดเจนที่สุดในการทำสิ่งนี้” ตามที่ OP กล่าวถึง แม้ว่าไกด์จะไม่สนับสนุนรูปแบบที่ชัดเจนว่า“ ถ้า” เป็นเช่นนั้น
Anton Strogonoff

0

นี่เป็นวิธีการอื่น:

cond_list = ['cond1 == "val1"','cond2=="val2"','cond3=="val3"','cond4=="val4"']
if all([eval(i) for i in cond_list]):
 do something

นอกจากนี้ยังทำให้ง่ายต่อการเพิ่มเงื่อนไขอื่นได้อย่างง่ายดายโดยไม่ต้องเปลี่ยนคำสั่ง if เพียงเพิ่มเงื่อนไขอื่นในรายการ

cond_list.append('cond5=="val5"')


0

หากเงื่อนไข if & an else ของเราต้องใช้คำสั่งหลาย ๆ คำภายในนั้นกว่าที่เราจะสามารถเขียนได้ด้านล่าง ทุกครั้งที่เรามีตัวอย่างอื่นที่มีคำสั่งหนึ่งอยู่ภายใน

ขอบคุณมันใช้งานได้สำหรับฉัน

#!/usr/bin/python
import sys
numberOfArgument =len(sys.argv)
weblogic_username =''
weblogic_password = ''
weblogic_admin_server_host =''
weblogic_admin_server_port =''


if numberOfArgument == 5:
        weblogic_username = sys.argv[1]
        weblogic_password = sys.argv[2]
        weblogic_admin_server_host =sys.argv[3]
        weblogic_admin_server_port=sys.argv[4]
elif numberOfArgument <5:
        print " weblogic UserName, weblogic Password and weblogic host details are Mandatory like, defalutUser, passwordForDefaultUser, t3s://server.domainname:7001 ."
        weblogic_username = raw_input("Enter Weblogic user Name")
        weblogic_password = raw_input('Enter Weblogic user Password')
        weblogic_admin_server_host = raw_input('Enter Weblogic admin host ')
        weblogic_admin_server_port = raw_input('Enter Weblogic admin port')
#enfelif
#endIf

0

ให้อภัย noobness ของฉัน แต่มันเกิดขึ้นที่ฉันไม่รู้ #Python เหมือนกับที่คุณทุกคนที่นี่ แต่มันเกิดขึ้นที่ฉันพบสิ่งที่คล้ายกันเมื่อสคริปต์วัตถุของตัวเองในแบบจำลอง BIM 3D ดังนั้นฉันจะปรับอัลกอริทึมของฉัน ของหลาม

ปัญหาที่ฉันพบที่นี่เป็นสองด้าน:

  1. ค่าของฉันดูเหมือนต่างประเทศสำหรับคนที่อาจพยายามถอดรหัสสคริปต์
  2. การบำรุงรักษาโค้ดจะมีค่าใช้จ่ายสูงหากค่าเหล่านั้นเปลี่ยนไป (น่าจะเป็นได้มากที่สุด) หรือหากต้องเพิ่มเงื่อนไขใหม่ (schema ที่ใช้งานไม่ได้)

ทำเพื่อหลีกเลี่ยงปัญหาเหล่านี้สคริปต์ของคุณต้องเป็นแบบนี้

param_Val01 = Value 01   #give a meaningful name for param_Val(i) preferable an integer
param_Val02 = Value 02
param_Val03 = Value 03
param_Val04 = Value 04   # and ... etc

conditions = 0           # this is a value placeholder

########
Add script that if true will make:

conditions = conditions + param_Val01   #value of placeholder is updated
########

### repeat as needed


if conditions = param_Val01 + param_Val02 + param_Val03 + param_Val04:
    do something

ข้อดีของวิธีนี้:

  1. สามารถอ่านสคริปต์ได้

  2. สคริปต์สามารถบำรุงรักษาได้ง่าย

  3. เงื่อนไขเป็นการดำเนินการเปรียบเทียบ 1 กับผลรวมของค่าที่แสดงถึงเงื่อนไขที่ต้องการ
  4. ไม่จำเป็นต้องมีเงื่อนไขหลายระดับ

หวังว่ามันจะช่วยคุณทุกคน

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