หลักการตั้งชื่อ Python สำหรับโมดูล


102

ฉันมีโมดูลที่มีจุดประสงค์เพื่อกำหนดคลาสที่เรียกว่า "ปลายปากกา" (และคลาสอื่น ๆ ที่เกี่ยวข้องด้วย) ฉันจะเรียกโมดูลนี้ได้อย่างไร? "จะงอย"? "nibmodule"? มีอะไรอีกไหม

คำตอบ:


110

เพียงปลายปากกา ตั้งชื่อคลาส Nib ด้วยตัวพิมพ์ใหญ่ N สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการตั้งชื่อและคำแนะนำสไตล์อื่น ๆ โปรดดูPEP 8คำแนะนำสไตล์ Python


2
โครงการ Python ส่วนใหญ่ปฏิบัติตามอนุสัญญานี้หรือไม่ เนื่องจากฉันสังเกตเห็นว่าคลาสในตัวจะเป็นตัวพิมพ์เล็กเช่น list, string เป็นต้น
Ram Rachum

4
คุณสังเกตว่าประเภทบิลด์อินถูกต้อง สิ่งเหล่านี้เป็นข้อยกเว้นที่แน่นอน คลาสอื่น ๆ ส่วนใหญ่ที่กำหนดไว้ในไลบรารีมาตรฐานจะเป็นตัวพิมพ์ใหญ่
Stephan202

2
ฉันคิดว่านี่เป็นแบบแผนที่ถูกต้อง แต่ก็มีปัญหาโดยธรรมชาติอย่างน้อยฉันก็ดูเหมือนว่า ว่าฉันมีระดับที่เรียกว่าและเข้าใจฉันมักจะต้องการให้กรณีของมันที่ผมอยากจะเรียกร้องClient clientแต่ตามหลักการของคุณชื่อโมดูลจะเป็นclientดังนั้นฉันจะต้องตั้งชื่ออินสแตนซ์ของฉันในสิ่งที่ไม่เป็นธรรมชาติclient_instanceเสมอ คุณคิดอย่างไรกับปัญหานี้?
Ray

3
@Ray แต่บอกว่าการประชุมมีการตั้งชื่อโมดูลแล้วมันจะปะทะกับชื่อชั้นClient Clientเนื่องจากมีเพียง 3 การตั้งชื่อที่เป็นไปได้สายพันธุ์ ( client, ClientหรือCLIENT) มีมักจะปะทะกันระหว่างสองกรณีเรียนโมดูลหรือค่าคงที่ ฉันเชื่อว่ามีน้อยครั้งที่คุณจะตั้งชื่อโมดูลของคุณให้เหมือนกับอินสแตนซ์หรือค่าคงที่มากกว่าคลาสดังนั้นจึงเป็นรูปแบบการตั้งชื่อที่ดีกว่าสำหรับความเป็นไปได้อื่น ๆ นอกจากนี้ยังทำให้การนำเข้าจากโมดูลสามารถอ่านได้มากขึ้นเนื่องจากโดยทั่วไปคุณจะนำเข้าคลาสและค่าคงที่แทนที่จะเป็นตัวแปร
Ted Klein Bergman

2
เหตุผลที่บิวน์อินเป็นตัวพิมพ์เล็กเพื่อบ่งบอกว่ามีการใช้งานใน C แทนที่จะเป็นไพ ธ อน
ฮาร์

41

ฉันจะเรียกมันว่า nib.py และฉันจะตั้งชื่อคลาส Nib ด้วย

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

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

มันเหมือนกับการเลียนแบบวิธี Java หนึ่งคลาสต่อไฟล์ แต่ด้วยความยืดหยุ่นที่เพิ่มขึ้นคุณสามารถเพิ่มคลาสอื่นลงในไฟล์เดียวได้หากเหมาะสม


28

ฉันรู้ว่าโซลูชันของฉันไม่ได้รับความนิยมมากนักจากมุมมอง pythonic แต่ฉันชอบใช้แนวทาง Java ของหนึ่งโมดูล -> หนึ่งคลาสโดยมีโมดูลชื่อเป็นคลาส ฉันเข้าใจเหตุผลเบื้องหลังสไตล์ python แต่ฉันไม่ชอบที่จะมีไฟล์ขนาดใหญ่มากที่มีคลาสมากมาย ฉันพบว่ามันยากที่จะเรียกดูแม้จะพับ

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

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


2
ปัญหาที่กล่าวถึงเกิดจากข้อ จำกัด ในตัวแก้ไขและในการใช้เครื่องมือควบคุมเวอร์ชันไม่ใช่ตามภาษาหรือรูปแบบการเขียนโปรแกรม หนึ่งคลาสต่อไฟล์เป็นอันตรายต่อโครงสร้างโค้ด ใช้spyderหรือเครื่องมือแก้ไขที่คล้ายกันเพื่อดูข้อมูลสรุปของคลาสของคุณเพื่อช่วยในการนำทางและบานหน้าต่างสองบานที่มีไฟล์เดียวกันเปิดอยู่บนทั้งสอง นอกจากนี้โปรดอ่าน PEP8 Python ใช้สำหรับเขียน Python และ Java สำหรับ Java แต่ Python ไม่ได้มีไว้สำหรับเขียน Java
Ioannis Filippidis

6
@IoannisFilippidis: ถ้าฉันต้องใส่คลาสทั้งหมดสำหรับโมดูลในไฟล์เดียวในขนาดรหัสที่ฉันจัดการตามปกติฉันจะไม่สามารถเปิดไฟล์ได้การชนกับเพื่อนร่วมงานคนอื่นจะพุ่งสูงขึ้นและเจ้านายของฉันจะถ่มน้ำลายใส่ฉัน ใบหน้า (เปรียบเปรยนั่นแหล่ะ) เพื่อเสนอมัน วิธีการไฟล์เดียวไม่ได้ปรับขนาด PEP-8 หรือไม่
Stefano Borini

3
@StefanoBorini: PEP8 ไม่ได้เรียกร้องให้ใช้ไฟล์เดียว หนึ่งคลาสต่อโมดูลและหนึ่งไฟล์ต่อ (หน่วยรหัส) เป็นสองขั้วของสเปกตรัมที่กว้างมาก หากคุณเห็นขนาดไฟล์ขนาดใหญ่ที่ไม่สามารถจัดการได้ในหนึ่งไฟล์ต่อโมดูลคุณควรพิจารณาทบทวนวิธีการแยกแพ็กเกจออกเป็นโมดูล
Chintalagiri Shashank

22

ปลายปากกาไม่เป็นไร หากมีข้อสงสัยโปรดดูคู่มือสไตล์ Python

จากPEP 8 :

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

เนื่องจากชื่อโมดูลถูกแมปกับชื่อไฟล์และระบบไฟล์บางระบบจึงไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่และตัดชื่อที่ยาวออกไปจึงเป็นสิ่งสำคัญที่ชื่อโมดูลจะถูกเลือกให้ค่อนข้างสั้นซึ่งจะไม่เป็นปัญหาใน Unix แต่อาจเป็น ปัญหาเมื่อรหัสถูกส่งไปยัง Mac หรือ Windows เวอร์ชันเก่าหรือ DOS

เมื่อโมดูลส่วนขยายที่เขียนด้วย C หรือ C ++ มีโมดูล Python ที่มาพร้อมกับอินเทอร์เฟซระดับที่สูงขึ้น (เช่นเชิงวัตถุมากขึ้น) โมดูล C / C ++ จะมีขีดล่างนำหน้า (เช่น _socket)


1
อืม ... นี่มันกระทบท้อง ฉันใช้คำนำหน้าขีดล่างในแพ็คเกจ / โมดูลสำหรับสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
Stefano Borini

0

จากPEP-8: ชื่อแพ็คเกจและโมดูล :

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

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

เมื่อโมดูลส่วนขยายที่เขียนด้วย C หรือ C ++มีโมดูล Python ที่มาพร้อมกับอินเทอร์เฟซระดับที่สูงขึ้น (เช่นเชิงวัตถุมากขึ้น) โมดูล C / C ++ จะมีขีดล่างนำหน้า (เช่น _socket)


-3

โมดูลfooใน python จะเทียบเท่ากับไฟล์คลาสFooใน Java

หรือ

โมดูลfoobarใน python จะเทียบเท่ากับไฟล์คลาสFooBarใน Java

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