ทำไมการตั้งชื่อตัวแปรidใน Python จึงไม่ดี
IDวิธีการแก้ปัญหาส่อเสียดมากขึ้นจะใช้ตัวแปร
ทำไมการตั้งชื่อตัวแปรidใน Python จึงไม่ดี
IDวิธีการแก้ปัญหาส่อเสียดมากขึ้นจะใช้ตัวแปร
คำตอบ:
id() เป็นพื้นฐานในตัว:
ความช่วยเหลือเกี่ยวกับฟังก์ชั่น
idในตัวในโมดูล__builtin__:id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
โดยทั่วไปการใช้ชื่อตัวแปรที่ทำให้เกิดคำหลักหรือฟังก์ชันในตัวในภาษาใด ๆ เป็นความคิดที่ไม่ดีแม้ว่าจะได้รับอนุญาตก็ตาม
idถูกกำหนดให้ลบในครั้งเดียว แต่ในที่สุดพวกเขาก็ตัดสินใจที่จะไม่ลบ ฉันไม่สามารถแก้ไขความคิดเห็นดั้งเดิมของฉันได้อีกต่อไปดังนั้นฉันจะลบมันเพื่อหลีกเลี่ยงความสับสนในอนาคต
str = 'an example word:cat!!'การใช้งาน มีอะไรใน PEPs ใด ๆ ที่ระบุว่าไม่ทำเช่นนี้?
ในPEP 8 - คู่มือสไตล์สำหรับรหัส Pythonคำแนะนำต่อไปนี้จะปรากฏในส่วนคำอธิบาย: รูปแบบการตั้งชื่อ :
single_trailing_underscore_: ใช้โดยการประชุมเพื่อหลีกเลี่ยงข้อขัดแย้งกับคำหลัก Python เช่น
Tkinter.Toplevel(master, class_='ClassName')
ดังนั้นเพื่อตอบคำถามตัวอย่างที่ใช้แนวทางนี้คือ:
id_ = 42
การใส่เครื่องหมายขีดล่างในชื่อตัวแปรทำให้เจตนาชัดเจน (สำหรับผู้ที่คุ้นเคยกับคำแนะนำใน PEP 8)
idเป็น builtin ไม่ใช่คำหลักและสิ่งนี้ไม่ได้อธิบายว่าทำไมมันจึงไม่ดีที่จะสร้างเงาในตัว
idเป็นฟังก์ชันในตัวที่ให้ข้อมูลประจำตัวของวัตถุ (ซึ่งเป็นที่อยู่หน่วยความจำใน CPython) หากคุณตั้งชื่อหนึ่งในฟังก์ชั่นของidคุณคุณจะต้องพูดbuiltins.idเพื่อรับต้นฉบับ (หรือ__builtins__.idใน CPython) การเปลี่ยนชื่อidทั่วโลกทำให้สับสนในทุกเรื่องยกเว้นสคริปต์ตัวเล็ก
อย่างไรก็ตามการใช้ชื่อที่มีอยู่แล้วภายในเป็นตัวแปรไม่ใช่สิ่งที่เลวร้ายตราบใดที่การใช้นั้นเป็นแบบโลคัล งูใหญ่มีจำนวนมากในตัวฟังก์ชั่นที่ (1) มีชื่อสามัญและ (2) คุณจะไม่ใช้อยู่แล้วมาก การใช้สิ่งเหล่านี้เป็นตัวแปรท้องถิ่นหรือเป็นสมาชิกของวัตถุก็โอเคเพราะเห็นได้ชัดจากบริบทสิ่งที่คุณทำ:
ตัวอย่าง:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
บิวด์อินบางส่วนมีชื่อที่ดึงดูด:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobjectidฟังก์ชันที่ส่งคืนที่อยู่หน่วยความจำของวัตถุนั้นเป็นรายละเอียดการใช้งานของ CPython นอกจากนี้ยังเป็นที่น่าสังเกตว่าฟังก์ชั่นนี้จะต้องส่งคืนหมายเลขที่แตกต่างกันสำหรับวัตถุที่ยังหลงเหลืออยู่สองตัวเท่านั้น หากวัตถุเป็นขยะที่เก็บรวบรวม id ของมันอาจถูกนำมารีไซเคิล
ฉันอาจพูดบางอย่างที่ไม่เป็นที่นิยมที่นี่: id()เป็นฟังก์ชันในตัวที่ค่อนข้างพิเศษซึ่งไม่ค่อยได้ใช้ในตรรกะทางธุรกิจ ดังนั้นฉันไม่เห็นปัญหาในการใช้มันเป็นชื่อตัวแปรในฟังก์ชั่นที่แน่นและเขียนได้ดีซึ่งเป็นที่ชัดเจนว่า id ไม่ได้หมายถึงฟังก์ชั่นในตัว
import this
idbuiltin อยู่แล้ว ที่กล่าวว่ามันใช้เวลาสักครู่เมื่อเพื่อนร่วมงานของฉันทำลายlistตัวบิวอินด้วยตัวแปรท้องถิ่น ดังนั้นกฎทั่วไปที่คนอื่นพูดถึงยังคงสมเหตุสมผล
มันไม่ดีที่จะตั้งชื่อตัวแปรใด ๆ หลังจากฟังก์ชันในตัว สาเหตุหนึ่งคือเนื่องจากอาจทำให้ผู้อ่านสับสนซึ่งไม่ทราบว่าชื่อถูกเขียนทับ
idเป็นฟังก์ชันในตัวใน Python การกำหนดค่าที่idจะแทนที่ฟังก์ชัน ดีที่สุดคือการเพิ่มคำนำหน้าเช่นเดียวกับในหรือใช้ในมูลค่าที่แตกต่างกันในขณะที่some_idID
ฟังก์ชั่นบิวด์อินจะใช้อาร์กิวเมนต์ตัวเดียวและส่งกลับจำนวนเต็มสำหรับที่อยู่หน่วยความจำของวัตถุที่คุณผ่าน (เป็น CPython)
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
เพราะมันเป็นชื่อของฟังก์ชันในตัว
อื่น ๆ ได้กล่าวว่ามันทำให้เกิดความสับสน แต่ผมต้องการที่จะขยายตัวในเหตุผล นี่คือตัวอย่างจากเรื่องจริง โดยทั่วไปฉันเขียนคลาสที่ใช้idพารามิเตอร์ แต่ลองใช้ builtin ในidภายหลัง
class Employee:
def __init__(self, name, id):
"""Create employee, with their name and badge id."""
self.name = name
self.id = id
# ... lots more code, making you forget about the parameter names
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
tay = Employee('Taylor Swift', 1985)
ผลลัพธ์ที่คาดหวัง:
Created Employee 'Taylor Swift' at 0x7efde30ae910
เอาท์พุทที่แท้จริง:
Traceback (most recent call last):
File "company.py", line 9, in <module>
tay = Employee('Taylor Swift', 1985)
File "company.py", line 7, in __init__
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable
ฮะ? ฉันพยายามโทรหา int ที่ไหน นั่นคือทั้งหมดที่มีอยู่ภายใน ...
ถ้าฉันตั้งชื่อbadge_idหรือid_ฉันจะไม่ได้มีปัญหานี้
เนื่องจาก python เป็นภาษาแบบไดนามิกจึงไม่ใช่ความคิดที่ดีที่จะให้ตัวแปรและฟังก์ชั่นชื่อเดียวกัน id () เป็นฟังก์ชั่นในไพ ธ อนดังนั้นจึงไม่แนะนำให้ใช้ตัวแปรชื่อ id โดยคำนึงถึงว่ามันใช้กับทุกฟังก์ชั่นที่คุณอาจใช้ ... ตัวแปรไม่ควรมีชื่อเดียวกับฟังก์ชั่น