หลักการตั้งชื่อใน Python สำหรับชื่อตัวแปรและฟังก์ชั่นคืออะไร?


772

มาจากพื้นหลัง C # แบบแผนการตั้งชื่อตัวแปรและชื่อวิธีมักจะเป็น camelCase หรือ PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

ใน Python ฉันได้เห็นข้างต้น แต่ฉันก็เห็นการใช้ขีดล่าง:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

มีรูปแบบการเข้ารหัสที่ดีกว่าและชัดเจนกว่าสำหรับ Python หรือไม่?

คำตอบ:


867

ดู Python PEP 8: ชื่อฟังก์ชั่นและตัวแปร :

ชื่อฟังก์ชั่นควรเป็นตัวพิมพ์เล็กโดยแยกคำด้วยเครื่องหมายขีดล่างเพื่อเพิ่มความสามารถในการอ่าน

ชื่อตัวแปรปฏิบัติตามแบบแผนเดียวกับชื่อฟังก์ชั่น

mixCaseได้รับอนุญาตเฉพาะในบริบทที่มีลักษณะที่แพร่หลายอยู่แล้ว (เช่นthreading.py ) เพื่อรักษาความเข้ากันได้ย้อนหลัง


127
PEP = ข้อเสนอการปรับปรุง Python
Peter Mortensen

8
@RickyRobinson คุณใช้โปรแกรมแก้ไขรหัสแบบไหนที่ไม่รู้ว่าขีดเส้นใต้ยังคงคำอยู่? ฟรีมากมายที่ทำ ฉันใช้ Notepad ++ ถ้า IDE ไม่พร้อมใช้งาน สำหรับสิ่งนั้นสามารถดาวน์โหลดเทมเพลตสำหรับการแก้ไขหลาม (ผู้อื่นสามารถแนะนำการดาวน์โหลดฟรีที่มีประโยชน์ยิ่งขึ้น)
ToolmakerSteve

57
กรณีหนึ่งสำหรับสไตล์ที่ขีดเส้นใต้คือคุณสามารถใช้ตัวอักษรคำเดียวดีกว่า สำหรับ (ค่อนข้างโง่) ตัวอย่างเช่นอาจจะไม่สวยงามเท่ากว่าfindMeAClass find_me_a_class
heltonbiker

9
ฉันพบว่าการประชุมของชื่อตัวแปรตัวพิมพ์เล็กทั้งหมดไม่เหมาะในการคำนวณทางวิทยาศาสตร์ซึ่งมักพบเจอกับค่าคงที่ที่รู้จักกันดีเทนเซอร์ ฯลฯ ที่เขียนด้วยตัวพิมพ์ใหญ่
andreasdr

12
@rr PEP8 เป็น "Style Guide" และอธิบายตัวเองว่าเป็นแบบแผนไม่ใช่แบบมาตรฐาน นอกจากนี้ยังอธิบายอย่างชัดเจนถึงเหตุผลที่ไม่ปฏิบัติตาม "กฎ" เหล่านั้น
Tahaan

710

คู่มือสไตล์ Google หลามมีการประชุมต่อไปนี้:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, ,function_parameter_namelocal_var_name

ควรใช้รูปแบบการตั้งชื่อที่คล้ายกันกับ CLASS_CONSTANT_NAME


37
a) ฉันรักตัวอย่าง - ขอบคุณ b) CamelCase และ underscores undersractive ผสมกัน? แต่: เป็นมือใหม่สำหรับ Python และแบบจำลองข้อมูลที่ยืดหยุ่นมากขึ้นฉันคิดว่ามันมีความคิดที่แข็งแกร่งภายใต้คำแนะนำของ Google ...
Matthew Cornell

19
@ MatthewCornell ผสมไม่เลวตราบใดที่คุณติดมัน จริงๆแล้วมันทำให้การอ่านง่ายขึ้นถ้าคุณรู้ว่าฟังก์ชั่นมีขีดล่างและคลาสไม่ได้
Pithikos

1
@ Matthewthorn ฉันไม่คิดว่ามันจะเกี่ยวอะไรกับงูหลาม ไปบังคับใช้มาตรฐานความงามตามอำเภอใจและจะล้มเหลวในการรวบรวมหากคุณไม่ปฏิบัติตามตัวอย่างเช่นการประชุมรั้งปีกกา โดยพื้นฐานแล้วมันคือการทอยลูกเต๋าว่าใครบางคนมีความคิดอย่างระมัดระวังหรือแค่รักในสิ่งที่พวกเขาทำ
คู่ปรับ Shot

คุณจะพิจารณาแอตทริบิวต์คงที่เป็น GLOBAL_CONSTANT_NAME ไหม มันไม่ได้เป็นสากลอย่างที่มันอยู่ในขอบเขตของชั้นเรียน
James T.

จากนั้นก็เดินเข้ามาproperty... บางทีมันอาจเป็นเรื่องของไอเท็มที่แสร้งทำเป็นแทนที่จะเป็นสิ่งที่มันเป็นจริง
joelb

240

David Goodger (ใน "รหัส Like Pythonista" ที่นี่ ) อธิบายคำแนะนำ PEP 8 ดังนี้:

  • joined_lower สำหรับฟังก์ชั่นวิธีการแอตทริบิวต์ตัวแปร

  • joined_lowerหรือALL_CAPSค่าคงที่

  • StudlyCaps สำหรับชั้นเรียน

  • camelCase เพียงเพื่อให้สอดคล้องกับอนุสัญญาที่มีอยู่ก่อน


3
+1 ตัวอย่างภาพ แม้ว่าฉันจะไม่เห็นตำแหน่งที่ PEP8 แนะนำjoined_lowerสำหรับค่าคงที่แต่มีเพียง "ตัวพิมพ์ใหญ่ทั้งหมดที่ใช้เครื่องหมายขีดล่างเพื่อแยกคำ" ยังอยากรู้อยากเห็นเกี่ยวกับใหม่enumคุณลักษณะ
Bob Stein

1
StudlyCaps for classesเป็นกฎสากลที่ยอดเยี่ยมสำหรับการเรียนในเกือบทุกภาษา แล้วทำไมบางชั้นในตัวหลาม (เช่นdatetime.datetimeไม่ปฏิบัติตามอนุสัญญานี้)
Prahlad Yeri

3
@PraladYeri: น่าเสียดายที่unittest.TestCase.assertEqualเพื่อนไม่ทำตามแบบแผนงู ความจริงก็คือส่วนของห้องสมุดมาตรฐานของ Python ได้รับการพัฒนาก่อนที่อนุสัญญาจะแข็งตัวแล้วและตอนนี้เราก็ติดอยู่กับพวกมัน
wchargin

3
CamelCase กำลังสับสนเพราะบางคนบอกว่าเป็น "camelCase" (หรือที่รู้จักในชื่อ "MixedCase") และบางคนบอกว่าเป็น "CamelCase" (หรือที่รู้จักในชื่อ "StudlyCaps") ตัวอย่างเช่น PEP กล่าวถึง "CamelCase" ในขณะที่คุณพูดถึง "camelCase"
Pro Q

นี่ลิงค์ของคุณตายบางทีมันควรจะถูกแทนที่ด้วยบางสิ่งเช่นdavid.goodger.org/projects/pycon/2007/idiomatic
Wolf

42

ในฐานะที่เป็นแนวทางสไตล์สำหรับรหัสงูใหญ่ยอมรับ

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

โปรดทราบว่านี่หมายถึงไลบรารีมาตรฐานของ Python เท่านั้น หากพวกเขาไม่สามารถทำสิ่งที่สอดคล้องกันได้แสดงว่ามีความหวังมากที่จะมีระเบียบแบบแผนที่ยึดถือปฏิบัติกันมาสำหรับรหัส Python ทั้งหมดหรือไม่

จากนั้นและการสนทนาที่นี่ฉันจะอนุมานว่ามันไม่ใช่บาปที่น่ากลัวถ้าใครยังคงใช้การประชุมการตั้งชื่อของ Java หรือ C # (ชัดเจนและเป็นที่ยอมรับ) สำหรับตัวแปรและฟังก์ชั่นเมื่อข้ามไปยัง Python แน่นอนว่ามันเป็นการดีที่สุดที่จะปฏิบัติตามสไตล์ของ codebase / project / team ในขณะที่คู่มือสไตล์ Python ชี้ให้เห็นความมั่นคงภายในนั้นสำคัญที่สุด

อย่าลังเลที่จะยกเลิกฉันเป็นคนนอกรีต :-) เช่นเดียวกับ OP ฉันไม่ใช่ "Pythonista" แต่ยังไม่ได้


32

มีPEP 8ตามคำตอบอื่น ๆ ที่แสดง แต่ PEP 8 เป็นเพียงแนวทางสำหรับห้องสมุดมาตรฐานและเป็นเพียงคำสอนของพระกิตติคุณเท่านั้น หนึ่งในความเบี่ยงเบนที่พบบ่อยที่สุดของ PEP 8 สำหรับโค้ดส่วนอื่นคือการตั้งชื่อตัวแปรโดยเฉพาะสำหรับวิธีการ ไม่มีลักษณะเด่นเดียวแม้ว่าการพิจารณาปริมาณของรหัสที่ใช้ mixCase หากมีการทำสำมะโนประชากรที่เข้มงวดหนึ่งอาจจะจบลงด้วยรุ่น PEP 8 กับ mixCase มีการเบี่ยงเบนอื่น ๆ เล็กน้อยจาก PEP 8 ที่ค่อนข้างเหมือนกัน


9
สิ่งนี้อาจเป็นจริงใน '08 เมื่อตอบคำถามนี้ แต่ทุกวันนี้ห้องสมุดหลักเกือบทั้งหมดใช้หลักการตั้งชื่อ PEP 8
Thane Brimhall

28

ดังที่กล่าวไว้ PEP 8 บอกว่าจะใช้lower_case_with_underscoresสำหรับตัวแปรวิธีการและฟังก์ชั่น

ฉันชอบใช้lower_case_with_underscoresสำหรับตัวแปรและmixedCaseสำหรับวิธีการและฟังก์ชั่นทำให้รหัสชัดเจนและอ่านง่ายขึ้น ดังนั้นการติดตามZen of Python "ชัดเจนดีกว่าโดยนัย" และ "จำนวนการอ่านได้"


3
+1 ฉันสลับสองสิ่งนี้ (ฉันใช้ mixCase สำหรับตัวแปร) แต่การมีทุกอย่างแตกต่างกันมากขึ้นเช่นนั้นจะช่วยให้ชัดเจนทันทีว่าคุณกำลังทำอะไรโดยเฉพาะอย่างยิ่งเมื่อคุณสามารถผ่านฟังก์ชั่นต่างๆได้
Xiong Chiamiov

2
แม้ว่า "การอ่าน" เป็นเรื่องส่วนตัว ฉันค้นหาวิธีที่มีขีดล่างอ่านได้มากขึ้น
Pithikos

ความชอบของคุณคือสัญชาติญาณเริ่มต้นของฉันที่มาจากการพัฒนา Java มานานหลายปี ฉันชอบใช้ _ สำหรับตัวแปร แต่จากสายตามันดูตลกสำหรับฉันกับฟังก์ชั่นและวิธีการ
Michael Szczepaniak

21

เพิ่มเติมจากสิ่งที่ @JohnTESlade ตอบ คำแนะนำสไตล์หลามของ Google มีคำแนะนำที่ค่อนข้างประณีต

ชื่อที่ควรหลีกเลี่ยง

  • ชื่อตัวละครเดียวยกเว้นตัวนับหรือตัววนซ้ำ
  • ขีดกลาง (-) ในชื่อแพ็กเกจ / โมดูลใด ๆ
  • \__double_leading_and_trailing_underscore__ names (สงวนไว้โดย Python)

อนุสัญญาการตั้งชื่อ

  • "ภายใน" หมายถึงภายในของโมดูลหรือได้รับการป้องกันหรือเป็นส่วนตัวภายในชั้นเรียน
  • การเพิ่มขีดล่างเดียว (_) มีการสนับสนุนบางอย่างสำหรับการปกป้องตัวแปรโมดูลและฟังก์ชั่น (ไม่รวมอยู่ในการนำเข้า * จาก) การเตรียมการขีดเส้นใต้คู่ (__) ให้กับตัวแปรหรือวิธีการทำหน้าที่อย่างมีประสิทธิภาพเพื่อทำให้ตัวแปรหรือวิธีการส่วนตัวกับคลาสของมัน (โดยใช้ชื่อ mangling)
  • วางคลาสที่เกี่ยวข้องและฟังก์ชันระดับบนสุดไว้ด้วยกันในโมดูล แตกต่างจาก Java ไม่จำเป็นต้อง จำกัด ตัวเองเป็นหนึ่งคลาสต่อโมดูล
  • ใช้CapWordsสำหรับชื่อคลาส แต่lower_with_under.pyสำหรับชื่อโมดูล แม้ว่าจะมีชื่อโมดูลที่มีอยู่มากมายCapWords.pyแต่ตอนนี้ก็ไม่ได้รับการสนับสนุนเนื่องจากมีความสับสนเมื่อโมดูลนั้นถูกตั้งชื่อหลังจากคลาส ("รอ - ฉันเขียนimport StringIOหรือยังfrom StringIO import StringIO?")

คำแนะนำที่ได้รับจากคำแนะนำของ Guido ป้อนคำอธิบายรูปภาพที่นี่


17

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

ฉันก็เหมือน CamelCase ดีกว่าเพราะมันเหมาะกับที่ดีขึ้นด้วยวิธีการเรียนการตั้งชื่อมันให้ความรู้สึกตรรกะมากขึ้นที่จะมีมากกว่าSomeClass.doSomething() SomeClass.do_something()หากคุณมองไปรอบ ๆ ในดัชนีโมดูลส่วนกลางใน python คุณจะพบทั้งสองอย่างเนื่องจากความจริงที่ว่ามันเป็นคอลเลกชันของห้องสมุดจากแหล่งต่าง ๆ ที่เพิ่มขึ้นล่วงเวลาและไม่ใช่สิ่งที่ถูกพัฒนาโดย บริษัท เดียวเช่น Sun . ฉันจะบอกว่าบรรทัดล่างคือ: ใช้สิ่งที่คุณชอบดีกว่ามันเป็นเพียงคำถามของรสนิยมส่วนตัว


10
ฉันมาจากพื้นหลังของจาวาและฉันพบว่าการใช้คำไม่ได้ผลและไม่น่าสนใจโดยมีเพียงความเห็นเท่านั้น การตั้งชื่อนั้นมีความสมดุลระหว่างความสามารถในการอ่านและความกะทัดรัด Unix ไปไกลเกินไป แต่en.wikipedia.org/wiki/Domain-specific_languageนั้นมี จำกัด CamelCase สามารถอ่านได้เนื่องจากตัวพิมพ์ใหญ่ แต่ไม่มีตัวอักษรพิเศษ 2c
Matthew Cornell

2
สำหรับฉันขีดล่างมีความน่าสนใจในฟังก์ชั่น / วิธีการเพราะฉันเห็นขีดล่างทุกคนเป็นตัวคั่นสำหรับ namespace เสมือน (ในหัวของฉัน) วิธีการที่ฉันสามารถทราบวิธีการตั้งชื่อฟังก์ชั่นใหม่ / วิธีการของฉัน: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos

3
คุณไม่ได้รับ (โดยทั่วไป) การโทรSomeClass.doSomething()(วิธีการคงที่มักจะหายาก) คุณมักจะโทรan_instance.do_something()
เดฟ

15

ส่วนตัวฉันพยายามใช้ CamelCase สำหรับคลาส, เมธอดและฟังก์ชัน mixCase ตัวแปรมักขีดเส้นใต้คั่นด้วย (เมื่อฉันจำได้) ด้วยวิธีนี้ฉันสามารถบอกได้ทันทีว่าฉันกำลังโทรอะไรมากกว่าทุกอย่างที่เหมือนกัน


15
กรณี Camel เริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็ก IIRC เช่น "camelCase"
UnkwnTech

11
ฉันคิดว่า crystalattice ทำให้ถูกต้อง - อย่างน้อยการใช้งานของเขาก็สอดคล้องกับการใช้งานใน PEP8 (CamelCase และ MixedCase)
Jarrett

1
@UnkwnTech คำว่า FirstLetterUpper บางครั้งเรียกว่า PascalCase
SurpriseDog

CamelCase หรือ camelCase? เพียงแค่สงสัย.
สุมิตร Pokhrel

11

มีบทความเกี่ยวกับเรื่องนี้: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR มันบอกว่า snake_case นั้นอ่านได้ง่ายกว่า camelCase นั่นเป็นเหตุผลว่าทำไมภาษาสมัยใหม่จึงใช้งู (หรือควรใช้) งูทุกที่ที่ทำได้


9
ที่น่าสนใจคือมันยังบอกด้วยว่า "ผลของการศึกษาครั้งนี้อาจไม่จำเป็นต้องใช้กับตัวระบุที่ฝังอยู่ในซอร์สโค้ดมันเป็นไปได้อย่างสิ้นเชิงที่ตัวบ่งชี้ที่ใช้กล้องถ่ายวิดีโออาจทำหน้าที่เป็นองค์ประกอบ gestalt ที่ดีกว่า
rob3c

2

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


0

ฉันใช้ระเบียบการตั้งชื่อของ Java เป็นการส่วนตัวเมื่อพัฒนาในภาษาการเขียนโปรแกรมอื่น ๆ เนื่องจากสอดคล้องและง่ายต่อการติดตาม ด้วยวิธีนี้ฉันไม่ได้ดิ้นรนอย่างต่อเนื่องเกี่ยวกับการประชุมที่จะใช้ซึ่งไม่ควรเป็นส่วนที่ยากที่สุดของโครงการของฉัน!


ฉันค่อนข้างเห็นด้วย หากภาษา X เป็นเพียงโครงการขนาดเล็กการสลับบริบทของวิธีจัดรูปแบบข้อความอาจเป็นภาระ อาการสะอึกหลักคือไลบรารีจะมีการโทรในสไตล์เดียว ( library_function(my_arg))
ลาน

-2

โดยทั่วไปคนหนึ่งปฏิบัติตามอนุสัญญาที่ใช้ในห้องสมุดมาตรฐานของภาษา

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