Tại sao nó là xấu khi đặt tên một biến idtrong Python?
ID.
Tại sao nó là xấu khi đặt tên một biến idtrong Python?
ID.
Câu trả lời:
id() là một tích hợp cơ bản:
Trợ giúp về chức năng tích hợp
idtrong mô-đun__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.)
Nói chung, sử dụng tên biến làm lu mờ từ khóa hoặc hàm tích hợp trong bất kỳ ngôn ngữ nào là một ý tưởng tồi, ngay cả khi nó được cho phép.
iddự kiến sẽ loại bỏ cùng một lúc, nhưng cuối cùng họ quyết định không xóa nó. Tôi không còn có thể chỉnh sửa nhận xét ban đầu của mình, vì vậy tôi sẽ xóa nó để tránh gây nhầm lẫn cho mọi người trong tương lai.
str = 'an example word:cat!!'. Có bất cứ điều gì trong bất kỳ PEP nào nói không làm điều này không?
Trong PEP 8 - Hướng dẫn kiểu cho mã Python , hướng dẫn sau sẽ xuất hiện trong phần Mô tả: Kiểu đặt tên :
single_trailing_underscore_: được sử dụng bởi quy ước để tránh xung đột với từ khóa Python, vd
Tkinter.Toplevel(master, class_='ClassName')
Vì vậy, để trả lời câu hỏi, một ví dụ áp dụng hướng dẫn này là:
id_ = 42
Việc bao gồm dấu gạch dưới trong tên biến làm cho ý định rõ ràng (với những người quen thuộc với hướng dẫn trong PEP 8).
idlà một nội dung, không phải là một từ khóa và điều này không giải thích tại sao nó xấu khi che giấu một nội dung.
idlà một hàm tích hợp cung cấp danh tính của một đối tượng (cũng là địa chỉ bộ nhớ của nó trong CPython). Nếu bạn đặt tên cho một trong các chức năng của mình id, bạn sẽ phải nói builtins.idđể lấy bản gốc (hoặc __builtins__.idbằng CPython). Đổi tên idtoàn cầu là khó hiểu trong bất cứ điều gì ngoại trừ một kịch bản nhỏ.
Tuy nhiên, việc sử dụng lại các tên dựng sẵn dưới dạng các biến không phải là quá tệ, miễn là việc sử dụng là cục bộ. Python có rất nhiều hàm dựng sẵn mà (1) có tên chung và (2) dù sao bạn cũng sẽ không sử dụng nhiều. Sử dụng chúng làm biến cục bộ hoặc làm thành viên của một đối tượng đều ổn vì rõ ràng từ ngữ cảnh bạn đang làm:
Thí dụ:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
Một số tích hợp với tên hấp dẫn:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_vào tên biến. Xin vui lòng xem câu trả lời của tôi .
idhàm trả về địa chỉ bộ nhớ của đối tượng là chi tiết triển khai CPython. Cũng đáng lưu ý rằng hàm chỉ được yêu cầu trả về một số khác nhau cho bất kỳ hai đối tượng còn lại nào . Nếu một đối tượng là rác được thu thập, id của nó có thể được tái chế.
Tôi có thể nói một cái gì đó không phổ biến ở đây: id()là một hàm tích hợp khá chuyên dụng hiếm khi được sử dụng trong logic kinh doanh. Do đó, tôi không thấy vấn đề gì khi sử dụng nó làm tên biến trong hàm chặt chẽ và được viết tốt, trong đó rõ ràng id không có nghĩa là hàm tích hợp.
import this
idnội dung dựng sẵn. Điều đó nói rằng tôi phải mất một thời gian khi một đồng nghiệp vượt qua phần listdựng sẵn với một biến cục bộ. Vì vậy, quy tắc chung mà người khác đề cập vẫn có ý nghĩa.
idlà một hàm tích hợp trong Python. Gán một giá trị idsẽ ghi đè hàm. Tốt nhất là thêm tiền tố vào some_idhoặc sử dụng nó trong một cách viết hoa khác như trong ID.
Hàm dựng sẵn nhận một đối số duy nhất và trả về một số nguyên cho địa chỉ bộ nhớ của đối tượng mà bạn đã truyền (trong CPython).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Những người khác đã đề cập rằng nó khó hiểu, nhưng tôi muốn mở rộng lý do tại sao . Đây là một ví dụ, dựa trên một câu chuyện có thật. Về cơ bản, tôi viết một lớp có một idtham số nhưng sau đó cố gắng sử dụng nội dung dựng idsau.
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)
Sản lượng dự kiến:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Sản lượng thực tế:
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
Huh? Tôi đang cố gọi một int ở đâu? Đó là tất cả các nội dung ...
Nếu tôi đặt tên cho nó badge_idhoặc id_, tôi sẽ không có vấn đề này.
Bởi vì python là một ngôn ngữ động, nên thường không nên đưa ra một biến và một hàm cùng tên. id () là một hàm trong python, vì vậy chúng tôi khuyên bạn không nên sử dụng biến có tên id. Lưu ý rằng, áp dụng cho tất cả các hàm mà bạn có thể sử dụng ... một biến không nên có cùng tên với một hàm.