ฉันควรใช้ตัวพิมพ์ใหญ่ทั้งหมดสำหรับค่าคงที่ของฉันหรือไม่


34

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


1
หากตัวแปรส่วนใหญ่ของคุณเป็นค่าคงที่ระดับโมดูลคุณอาจทำสิ่งผิดปกติ ส่วนใหญ่ควรอยู่ภายในฟังก์ชั่น
RemcoGerlich

1
คุณสามารถแสดงตัวอย่างรหัสของคุณที่ไพลินคิดว่าเป็นค่าคงที่ได้หรือไม่
Winston Ewert

@WinstonEwertNOTES_DIRECTORY = argv[1] chdir(NOTES_DIRECTORY) FILES = glob('*.txt') RAND_FILE = choice(FILES) with open(RAND_FILE) as notes_file: POINTS = notes_file.readlines() RAND_POINT = choice(POINTS)
Abhishek Kumar

@AbhishekKumar เป็นรหัสของคุณในฟังก์ชั่นหรือที่ระดับสูงสุด?
Winston Ewert

@WinstonEwert ที่ระดับสูงสุดและหลังจากทำตามคำแนะนำของ PyLint
Abhishek Kumar

คำตอบ:


33

คุณอาจจะเขียนโค้ดแบบนี้:

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
rand_file = choice(files)
with open(rand_file) as notes_file: 
    points = notes_file.readlines() 
    rand_point = choice(points)

คุณควรย้ายรหัสนี้เป็นฟังก์ชั่น:

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    rand_file = choice(files)
    with open(rand_file) as notes_file: 
        points = notes_file.readlines() 
        rand_point = choice(points)

# actually call the main function    
main()

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

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


1
ไม่เห็นด้วยอย่างยิ่งฉันคิดว่ามีเหตุผลไพทอนที่ดีมากมายในการใช้ตัวแปรระดับโมดูล ฉันคิดว่าคำแนะนำนี้เป็นเพียงสิ่งประดิษฐ์ของ pylint misreading PEP8 และสมมติว่าการสนทนาของ "ค่าคงที่ควรเป็นระดับโมดูล" ก็ควรเป็นจริงเช่นกัน
MetricSystem

21

ใช่. ตามกฎ PEP8s ในค่าคงที่ :

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

รุ่นยาว:

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

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


7
ในทางตรงกันข้ามมันเป็นไปได้ทั้งหมดที่pylintจะเข้าใจผิด Python ไม่ได้ให้วิธีการแยกค่าคงที่จากตัวแปรนอกเหนือจากค่าคงที่ที่คาดว่าจะมีค่าเดียวกันเสมอ pylintสมมติว่าสิ่งใดก็ตามที่ตั้งค่าเพียงครั้งเดียวและไม่เคยเปลี่ยนเป็นค่าคงที่ แต่ถ้ามันตั้งใจจะเป็นค่าคงที่นั่นอาจเป็นเพียงสิ่งประดิษฐ์ของการนำไปใช้ และโดยเฉพาะรหัสที่ให้ไว้ในความคิดเห็นของคำถามนั้นมีค่าที่จะแตกต่างกันในการวิ่งแต่ละครั้งดังนั้นจึงไม่ควรพิจารณาค่าคงที่แม้ว่า pylint จะคิดว่าพวกเขาเป็นอย่างไร
Jules

@Jules ฉันจะเรียกตัวแปรตั้งครั้งเดียวและการเปลี่ยนแปลงในระหว่างรันไทม์ไม่คงที่อีกต่อไปจึงมีอยู่ในหลายภาษา (เช่นใน JS) constคำหลัก แม้ว่าค่าเริ่มต้นจะแตกต่างอื่น ๆ PIกว่าบางที
โทมัสขยะ

1
ฉันแยกความแตกต่างระหว่างตัวแปรที่เปลี่ยนแปลงไม่ได้ (เช่นสิ่งที่ตั้งไว้ที่รันไทม์และไม่เปลี่ยนแปลง) และค่าคงที่ (เช่นสิ่งที่เหมือนกันในทุกโปรแกรมที่เรียกใช้และถ้าภาษามีตัวเลือกให้ทำก็สามารถคำนวณได้ในเวลารวบรวม ) ... ประเด็นคือเพราะไม่มีวิธีระบุความแตกต่างกับไพ ธ อนใด ๆpylintสันนิษฐานว่าสิ่งหลังแม้ในอดีตคือกรณี
จูลส์

Pylint ผิดอย่างแน่นอนในการที่มันอ่าน "ค่าคงที่ควรเป็นระดับโมดูล" และสันนิษฐานว่า "ระดับโมดูลควรเป็นค่าคงที่" แต่เนื่องจากเป็นเครื่องมือที่ดีและมีประโยชน์ดูเหมือนว่าเรากำลังติดอยู่กับมัน
MetricSystem

@MetricSystem คุณคิดว่าอะไร - ฟังก์ชั่นตัวแปรระดับโมดูลจะมีค่าคงที่หรือไม่? ควรจะเปลี่ยนแปลงหรือไม่
Thomas Junk

13

PEP8 และ Python ALL_CAPS_CONSTANTSบรรทัดฐานชุมชนคือการใช้งาน มันเป็นเงื่อนงำภาพทั่วไปที่ใช้มานานหลายทศวรรษใน C, Java, Perl, PHP, Python, ทุบตีและภาษาการเขียนโปรแกรมอื่น ๆ และสภาพแวดล้อมของเชลล์ แต่ในสำนวนออนไลน์ที่ทันสมัยALL CAPS หมายตะโกน และตะโกนหยาบคาย

ALL_CAPS_CONSTANTSงูหลามเป็นอย่างไรค่อนข้างสอดคล้องกันเกี่ยวกับ JavaScript อาจจะมีแต่งูใหญ่มีMath.PI math.piไม่มีค่าคงตัวที่เป็นที่รู้จักหรือยืนยาวกว่าπ หรือลองพิจารณาsys.version_infoเวอร์ชั่นของ Python ที่คุณใช้งานอยู่ ค่าคงที่ 100% ตลอดอายุการใช้งานโปรแกรมของคุณ - มากกว่าPORTหรือMAX_ITERATIONSค่าคงที่อื่นที่คุณกำหนด หรือวิธีการเกี่ยวsys.maxsize? ค่าจำนวนเต็มสูงสุดในแพลตฟอร์มของคุณคงที่ไม่เพียงแค่โปรแกรมหนึ่งหรือสองทำงาน แต่อายุการใช้งานของฮาร์ดแวร์ของคุณ

หากค่าคงที่เหล่านี้ - รวมทั้งค่า like และ e ที่เป็นค่าคงที่พื้นฐานของจักรวาลและจะไม่แตกต่างกันไปชั่วนิรันดร์ - ถ้าพวกมันสามารถเป็นตัวพิมพ์เล็กได้ดี ... ดังนั้นค่าคงที่อื่น ๆ คุณสามารถเลือก.

โปรดจำไว้ว่าPEP8เป็นคู่มือสไตล์ แนวทางไม่ใช่กฎหมาย แนวปฏิบัติมักฝ่าฝืนแม้กระทั่งห้องสมุดมาตรฐานของไพ ธ อน และอ้างถึงแนวทางหลัก Python อื่นPEP20 (หรือที่รู้จักว่า "The Zen of Python"):

  • สวยดีกว่าน่าเกลียด
  • จำนวนการอ่าน
  • การปฏิบัติจริงชนะความบริสุทธิ์

ในบันทึกที่ใช้งานได้จริงเมื่อโปรแกรมYELLY_CONSTANTและSHOUTY_PARAMETERเริ่มเสียดสีมันช่วยให้จำได้ว่าค่าคงที่ของตัวพิมพ์ใหญ่โดยทั่วไปจะไม่ทนต่ออุดมคติของ Plonicอย่างแท้จริงแต่เป็นพารามิเตอร์ของโปรแกรมที่เรียกใช้ ไม่มีอะไรที่แท้จริงอย่างต่อเนื่องเกี่ยวกับการเป็นPORT, SITENAMEหรือNUMRUNSและพวกเขาไม่จำเป็นต้องได้รับการจัดการเป็น Globals โปรแกรมแบบสแตนด์อโลน ตัวอย่างเช่นพวกเขาสามารถวางลงในพจนานุกรมเป็นกลุ่มของพารามิเตอร์โปรแกรมที่เข้าถึงได้ทั่วโลก:

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

Python มีพารามิเตอร์คีย์เวิร์ดการส่งผ่านสิ่งอำนวยความสะดวกที่ช่วยลดความจำเป็นในการใช้APPARENTLY_ANGRY_GLOBAL_VARIABLES:

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

ในทางปฏิบัติค่าเหล่านี้จำนวนมากจะอ่าน (หรือควร) จากไฟล์ปรับแต่งตัวแปรสภาพแวดล้อมระบบปฏิบัติการอาร์กิวเมนต์บรรทัดคำสั่งหรือแหล่งข้อมูลอื่น ๆ เพื่อตอบสนองการผกผันของหลักการ / รูปแบบการควบคุม แต่นั่นเป็นเรื่องราวที่ใหญ่กว่าสำหรับอีกวัน


1

ใช่เป็นเรื่องปกติในภาษาโปรแกรมส่วนใหญ่ (อย่างน้อยที่ฉันใช้)

คุณสามารถอ้างถึงลิงก์ Googleนี้เพื่อแชร์สไตล์ทั่วไประหว่างนักพัฒนาของทีมเดียวกัน

แนะนำให้ใช้

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