เหตุใดไพลินท์จึงตั้งชื่อตัวแปรอักขระเดี่ยว


100

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

for x in x_values:
   my_list.append(x)

และเมื่อฉันเรียกใช้pylintฉันได้รับInvalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- นั่นแสดงให้เห็นว่าชื่อตัวแปรที่ถูกต้องต้องมีความยาวระหว่าง 3 ถึง 31 อักขระ แต่ฉันได้ดูหลักเกณฑ์การตั้งชื่อ PEP8แล้วและฉันไม่เห็นอะไรที่ชัดเจนเกี่ยวกับตัวอักษรตัวพิมพ์เล็กตัวเดียว และฉันเห็นตัวอย่างมากมายที่ใช้มัน

มีบางอย่างที่ฉันขาดหายไปใน PEP8 หรือเป็นมาตรฐานเฉพาะสำหรับไพลินท์?

คำตอบ:


48

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

คุณสามารถใช้สิ่งนี้เพื่อหลีกเลี่ยงชื่อสั้น ๆ ดังกล่าว:

my_list.extend(x_values)

หรือปรับแต่งการกำหนดค่าของ PyLint เพื่อบอก PyLint ว่าชื่อตัวแปรใดดี


10
การใช้_เพื่อเก็บค่าชั่วคราวคือการต่อต้านรูปแบบ ขีดตัวแปรบ่งชี้ที่ไม่เกี่ยวข้อง / ค่าทิ้งไม่ได้รับมอบหมายชั่วคราวเช่นหรือi xนอกจากนี้ในล่ามยังมีความหมายพิเศษในการเก็บค่าสุดท้ายของนิพจน์สุดท้าย
เจมส์

131

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

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

ที่นี่ pk (สำหรับคีย์หลัก), x และ y คือชื่อตัวแปรที่ฉันเพิ่ม


7
นี่คือคำตอบที่ดีที่สุด
giorgiosironi

1
pylint 1.8.3ดูเหมือนจะไม่ทำงาน pylint.pycqa.org/th/1.8/user_guide/options.html
James


2
สิ่งที่ฉันต้องการจริงๆคือให้ pylint ยอมรับ (ตามคำขอ) vars สั้น ๆ เมื่อใช้ในการทำความเข้าใจ เปรียบเทียบ return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] กับ return [a for a in thing.get_customer_addresses() if a.is_proper()] ฉันอ้างว่าหลังมีความชัดเจนมากขึ้นเนื่องจาก a ชัดเจนจากบริบท โดยทั่วไปความยาวตัวแปรควรสัมพันธ์กับขอบเขตของตัวแปร
EdvardM

22

ในภาษาที่พิมพ์มากตัวแปรชื่อตัวอักษร 1 ตัวสามารถเป็น ok-ish ได้เนื่องจากโดยทั่วไปคุณจะได้รับประเภทที่อยู่ถัดจากชื่อในการประกาศตัวแปรหรือในฟังก์ชัน / วิธีต้นแบบ:

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

ใน Python คุณจะไม่ได้รับข้อมูลนี้ดังนั้นหากคุณเขียน:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

คุณไม่ทิ้งร่องรอยใด ๆ ให้กับทีมซ่อมบำรุงเกี่ยวกับสิ่งที่ฟังก์ชันนี้สามารถทำได้และวิธีการเรียกใช้และสิ่งที่ส่งคืน ดังนั้นใน Python คุณมักจะใช้ชื่อที่สื่อความหมาย:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

และคุณยังเพิ่ม docstring เพื่ออธิบายว่าสิ่งนี้ทำอะไรและคาดหวังประเภทใด


7
แทนที่จะเป็น "ภาษาที่รวบรวม" ฉันจะเขียนว่า "พิมพ์ผิด" Haskell เช่นคอมไพล์ด้วย แต่คุณสามารถเขียนการประกาศโดยปริยายเช่นใน Python
เซบาสเตียนมัค

14
แม้ว่าฉันจะเห็นด้วยกับคุณในกรณีเหล่านี้การบังคับให้อักขระ 3 ตัวขึ้นไปในชื่อตัวแปรไม่ได้หมายความว่าจะเป็นการอธิบาย ฉันกำลังใช้with open(FILE) as f: items = f.readlines()ตัวอย่างเช่นซึ่งตัวแปรfนั้นชัดเจนจริงๆ แต่ฉันได้รับคำเตือน pylint สิ่งนี้ทำให้ฉันเปลี่ยนเป็นเกล็ด 8
Axel ÖrnSigurðsson

3
คุณยังสามารถเปลี่ยนกฎไพลินท์เพื่ออนุญาตให้ 'f' เป็นชื่อตัวแปรได้ มีข้อยกเว้นสำหรับ i, j AFAIR อยู่แล้ว
gurney alex

10
สำหรับคนที่โหวตคำตอบนี้: ฉันเป็นคนที่แนะนำกฎใน Pylint และเหตุผลก็คือเหตุผลที่ให้ไว้ คุณอาจไม่เห็นด้วยกับการตัดสินใจนี้ แต่ก็ยังคงเป็นคำตอบสำหรับคำถาม ...
gurney alex

1
ฉันทำตามเหตุผลของคุณโดยสิ้นเชิงอย่างไรก็ตามบ่อยครั้งในอัลกอริทึมและการเขียนโปรแกรมทางคณิตศาสตร์โดยทั่วไปค่าบางค่าจะถูกตั้งชื่อด้วยตัวอักษรเดียว ฉันคิดว่าฟังก์ชันที่เรียกfนั้นแตกต่างจากฟังก์ชันที่เรียกOptionListว่า c โดยสิ้นเชิง โดยเฉพาะอย่างยิ่งเมื่อฉันไม่สามารถเปลี่ยนชื่อเป็นfunctionเพราะมันเงาในตัว
kap

19

ปัจจุบันยังมีตัวเลือกในการแทนที่ regexp กล่าวคือหากคุณต้องการอนุญาตให้อักขระเดี่ยวเป็นตัวแปร:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

ดังนั้นpylintจะจับคู่ PEP8 และจะไม่นำการละเมิดเพิ่มเติมมาด้านบน .pylintrcนอกจากนี้คุณสามารถเพิ่มเข้าไป


3
สำหรับเวอร์ชั่น> 1.8.3นี้น่าจะเป็นคำตอบ สามารถใส่สิ่งนี้ไว้ในของคุณ.pylintrcเช่นกันสำหรับ config ถาวร: variable-rgx=[a-z0-9_]{1,30}$.
เจมส์

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" อาจเหมาะสมกว่าเล็กน้อย "9" ไม่ควรเป็นชื่อตัวแปรที่ถูกต้อง
Eric Le Fort

16

เหตุผลลึกคือการที่คุณอาจจะจำสิ่งที่คุณตั้งใจa, b, c, x, yและzหมายถึงเมื่อคุณเขียนรหัสของคุณ แต่เมื่อคนอื่น ๆ อ่านมันหรือแม้กระทั่งเมื่อคุณกลับมาถึงรหัสของคุณรหัสกลายเป็นอ่านได้มากขึ้นเมื่อคุณได้ให้ มันเป็นชื่อทางความหมาย เราไม่ได้เขียนสิ่งต่างๆเพียงครั้งเดียวบนกระดานดำแล้วลบทิ้ง เรากำลังเขียนโค้ดที่อาจใช้เวลาประมาณหนึ่งทศวรรษหรือมากกว่านั้นและสามารถอ่านได้หลาย ๆ ครั้ง

ใช้ชื่อความหมาย ชื่อความหมายที่ผมเคยใช้ได้รับเช่นratio, denominator, obj_generator, pathฯลฯ มันอาจใช้เวลาสองพิเศษหรือสองพิมพ์พวกเขาออก แต่เวลาที่คุณประหยัดพยายามคิดสิ่งที่คุณเขียนถึงครึ่งชั่วโมงจากนั้นจะดีคุ้มค่า .


7
ขอบคุณ. นี่คือรหัสสุดท้าย - gist.github.com/amandabee/8969833 - ฉันเห็นประเด็นของคุณเกี่ยวกับรหัสที่ฉัน (หรือคุณ) สามารถอ่านได้ในหนึ่งปี แต่ในกรณีนี้ฉันคิดว่า x และ y เป็นคำอธิบายอย่างแท้จริง
Amanda

OTOH ถ้าฉันแยกองค์ประกอบ <dt /> จากเอกสาร XML การจัดเก็บในตัวแปร 'dt' ดูเหมือนจะค่อนข้างชัดเจนในขณะที่จัดเก็บเป็น 'วันที่' (ซึ่งเป็นสิ่งที่องค์ประกอบนี้เกิดขึ้นเพื่อแสดงถึง) อาจทำให้เกิดความสับสน และการสร้างบางสิ่งเช่น "the_dt_field" เป็นเพียงอาการโง่ (ไม่ฉันไม่สามารถควบคุมชื่อองค์ประกอบมันเป็นสคีมาของคนอื่น) ต้องมีข้อยกเว้นมากมายที่ทดสอบกฎ
Mark Wood
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.