PEP 8 ทำไมไม่มีช่องว่างรอบ ๆ '=' ในอาร์กิวเมนต์คำหลักหรือค่าพารามิเตอร์เริ่มต้น


103

ทำไมPEP 8 แนะนำไม่ได้มีช่องว่าง=ในการโต้แย้งคำหลักหรือค่าพารามิเตอร์เริ่มต้น ?

สิ่งนี้ไม่สอดคล้องกับการแนะนำช่องว่างรอบ ๆ เหตุการณ์อื่น ๆ=ในรหัส Python หรือไม่

อย่างไร:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

ดีกว่า:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

ลิงก์ไปยังการสนทนา / คำอธิบายโดยBDFLของ Python จะได้รับการชื่นชม

ในใจคำถามนี้เกี่ยวกับ kwargs มากกว่าค่าเริ่มต้นฉันเพิ่งใช้วลีจาก PEP 8

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

คำตอบ:


72

ฉันเดาว่าเป็นเพราะอาร์กิวเมนต์คำหลักแตกต่างจากการกำหนดตัวแปรเป็นหลัก

ตัวอย่างเช่นมีโค้ดมากมายเช่นนี้:

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

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

นอกจากนี้พารามิเตอร์มักจะอยู่ในบรรทัดเดียวกันในขณะที่งานมักจะอยู่ในบรรทัดของตัวเองดังนั้นการประหยัดพื้นที่จึงน่าจะเป็นเรื่องสำคัญ


6
อาจเป็นกรณีนี้ แต่ก็ยังดูแปลกที่จะนำเสนอไอคอน IMO นี้ในคำแนะนำสไตล์โค้ดสำหรับภาษาที่ออกแบบมาอย่างดีเพียงเพื่อบันทึกอักขระ 2 ตัว เหมือนกับว่ารูปแบบรหัสจาวากล่าวว่า{การขึ้นบรรทัดใหม่หลังจากนั้นifเป็นเรื่องเล็กน้อย (บันทึกจำนวนอักขระเท่ากัน) แต่ไม่อยู่ในนิยามคลาส นอกจากนี้พารามิเตอร์คำหลักยังแตกต่างจากค่าเริ่มต้น แต่ยังคงใช้คำแนะนำรูปแบบเดิม
soulcheck

3
อย่างที่ฉันบอกว่าพวกเขาเป็นสิ่งที่แตกต่างกัน ควรเขียนให้แตกต่างกัน
fortran

6
ฉันจะบอกว่ามันอ่านไม่ออกจริงๆมากกว่าkw1 = kw1, kw2 = kw2;) แต่นั่นอาจเป็นสิ่งที่กุยโดและแบร์รี่คิด
soulcheck

1
ฉันจะยอมรับเรือคนนี้เพราะมันค่อนข้างน่าเชื่อ จะไม่สนใจลิงค์ที่ยืนยันว่า
soulcheck

5
ความจริงที่ว่าอาร์กิวเมนต์คำหลักแตกต่างจากการกำหนดตัวแปรโดยพื้นฐานแล้วไม่ใช่อาร์กิวเมนต์ที่ถูกต้องที่จะมี IMO ที่เป็นแบบแผนต่างกันเนื่องจากความแตกต่างนั้นชัดเจนอยู่แล้วจากบริบท อดีตเกิดขึ้นภายในการเรียกใช้ฟังก์ชันและส่วนหลังต้องอยู่คนเดียวที่ระดับการเยื้องปัจจุบัน IMO สำหรับชื่อตัวแปรที่ยาวเกิน 5-6 ตัวอักษร (เช่นชีวิตจริงสำหรับส่วนใหญ่) ตัวแปรที่มีช่องว่างจะอ่านได้ง่ายกว่า
Axel

13

ฉันจะไม่ใช้ very_long_variable_name เป็นอาร์กิวเมนต์เริ่มต้น ลองพิจารณาสิ่งนี้:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

มากกว่านี้:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

นอกจากนี้การใช้ตัวแปรเป็นค่าเริ่มต้นไม่สมเหตุสมผล บางทีตัวแปรคงบางตัว (ซึ่งไม่ใช่ค่าคงที่จริงๆ) และในกรณีนี้ฉันจะใช้ชื่อที่เป็นตัวพิมพ์ใหญ่ทั้งหมดบรรยาย แต่สั้นที่สุด ไม่มีอีก _ ทุก _...


1
นั่นคืออาร์กิวเมนต์คำหลักตัวอย่างที่คล้ายกันคือใน PEP ฉันทำให้อ่านได้น้อยลงเท่านั้น
soulcheck

3
คุณกำลังพูดว่า (โดยพื้นฐาน): เพื่อให้กฎการไม่เว้นวรรคเหมาะสมให้เขียนชื่อตัวแปรสั้น ๆ แต่ถ้ามีชื่อตัวแปร long-ish ดังนั้นกฎ no-space จะสร้างสภาพแวดล้อมที่รก ข้อโต้แย้งที่ว่า 'ไม่ใช่งานมอบหมายดังนั้นจึงเป็นคนละสิ่ง' ไม่ได้ตัดทิ้งสำหรับฉันเพราะฉันสนใจเกี่ยวกับความชัดเจนมากกว่าเรื่องความหมายและเพราะถ้าไม่ใช่ 'ค่าเริ่มต้นสำหรับการมอบหมายงาน' แล้วอะไรคือ มัน?
PatrickT

1
@PatrickT อาร์กิวเมนต์ "มันไม่ใช่งานมอบหมายดังนั้นพวกเขาจึงต่างกัน" ไม่มีอะไรจะอธิบายว่าทำไมจึงเป็นเช่นนั้น (แนวคิดเชิงปรัชญา); เป็นเพียงการอธิบายว่าเหตุใดจึงเป็นได้ (แนวคิดเชิงวากยสัมพันธ์)
Mateen Ulhaq

11

มีข้อดีข้อเสีย

ฉันไม่ชอบวิธีอ่านโค้ดที่สอดคล้องกับ PEP8 เป็นอย่างมาก ผมไม่ได้ซื้อเป็นอาร์กิวเมนต์ที่เคยสามารถอ่านของมนุษย์มากกว่าvery_long_variable_name=another_very_long_variable_name very_long_variable_name = another_very_long_variable_nameนี่ไม่ใช่วิธีที่คนอ่าน เป็นการเพิ่มความรู้ความเข้าใจโดยเฉพาะอย่างยิ่งในกรณีที่ไม่มีการเน้นไวยากรณ์

อย่างไรก็ตามมีประโยชน์อย่างมาก หากปฏิบัติตามกฎการเว้นวรรคจะทำให้การค้นหาพารามิเตอร์โดยใช้เครื่องมือมีประสิทธิภาพมากขึ้นเท่านั้น


ถ้าคุณยึดติดกับการเว้นวรรครอบ ๆ = การค้นหาโดยใช้เครื่องมือก็ไม่ต่างกัน
NoName

10

IMO การเว้นช่องว่างสำหรับ args ให้การจัดกลุ่มคู่ arg / value ที่ชัดเจนยิ่งขึ้น ดูรกน้อยลง


โดยทั่วไปฉันชอบเว้นวรรคมากดังนั้นฉันมักจะใส่ช่องว่างไว้ในวงเล็บด้วยดังนั้นพารามิเตอร์ทั้งหมดจึงล้อมรอบด้วยช่องว่าง แต่ฉันคิดว่าarg1=40มันสามารถอ่านได้มากกว่าเนื่องจากความสัมพันธ์ชัดเจนมากขึ้น
Charlie Gorichanaz

3

ฉันคิดว่ามีสาเหตุหลายประการสำหรับสิ่งนี้แม้ว่าฉันอาจจะหาเหตุผลเข้าข้างตนเอง:

  1. ช่วยประหยัดเนื้อที่ช่วยให้สามารถกำหนดฟังก์ชันและการเรียกใช้ให้พอดีกับบรรทัดเดียวได้มากขึ้นและประหยัดพื้นที่มากขึ้นสำหรับชื่ออาร์กิวเมนต์
  2. ด้วยการรวมคำหลักและค่าแต่ละคำเข้าด้วยกันคุณสามารถแยกอาร์กิวเมนต์ต่างๆได้ง่ายขึ้นโดยเว้นวรรคหลังเครื่องหมายจุลภาค ซึ่งหมายความว่าคุณสามารถมองเห็นได้อย่างรวดเร็วว่าคุณให้อาร์กิวเมนต์กี่ข้อ
  3. จากนั้นไวยากรณ์จะแตกต่างจากการกำหนดตัวแปรซึ่งอาจมีชื่อเดียวกัน
  4. นอกจากนี้ไวยากรณ์ยังแตกต่างจากการตรวจสอบความเท่าเทียมกัน (มากกว่า) a == bซึ่งอาจเป็นนิพจน์ที่ถูกต้องภายในการเรียก

3

สำหรับฉันมันทำให้โค้ดอ่านง่ายขึ้นและเป็นแบบแผนที่ดี

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

หากไม่มีข้อพิจารณาอื่น ๆ เราต้องการที่foo = 42จะทำfoo=42เพราะอย่างหลังไม่ได้มีการจัดรูปแบบเครื่องหมายเท่ากับโดยทั่วไปและเนื่องจากเดิมแยกตัวแปรและค่าด้วยการเว้นวรรคอย่างชัดเจน

แต่เมื่อมีการมอบหมายงานหลายรายการในหนึ่งบรรทัดเราชอบที่f(foo=42, bar=43, baz=44)จะทำf(foo = 42, bar = 43, baz = 44)เพราะการกำหนดเดิมจะแยกการมอบหมายงานหลายงานด้วยช่องว่างในขณะที่งานหลังไม่ได้ทำให้ยากที่จะดูว่าคู่คีย์เวิร์ด / ค่าอยู่ที่ใด

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

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