Чому погано називати змінну 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!!'. Чи є в когось із депутатів, що говорять, не робіть цього?
У PEP 8 - Посібник зі стилів для Python Code , наступні вказівки відображаються в розділі Описово: Імена стилів :
single_trailing_underscore_: використовується умовно, щоб уникнути конфліктів із ключовим словом Python, наприклад
Tkinter.Toplevel(master, class_='ClassName')
Отже, щоб відповісти на запитання, приклад, який застосовує цю інструкцію:
id_ = 42
Включення останнього підкреслення в назву змінної робить наміри зрозумілими (для тих, хто знайомий з вказівками в PEP 8).
idце вбудований, а не ключове слово, і це не пояснює, чому погано затінювати вбудований модуль.
id- це вбудована функція, яка надає ідентичність об'єкта (яка також є його адресою пам'яті в CPython). Якщо ви назвете одну із своїх функцій id, вам доведеться сказати, builtins.idщоб отримати оригінал (або __builtins__.idв CPython). Перейменування в idусьому світі є заплутаним ні в чому, окрім невеликого сценарію.
Однак повторне використання вбудованих імен як змінних не все так погано, якщо використання є локальним. У Python є багато вбудованих функцій, які (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, maxobject_до назви змінної. Будь ласка, дивіться мою відповідь .
idфункція, що повертає адресу пам'яті об'єкта, є деталлю реалізації CPython. Варто також зазначити, що функція потрібна лише для повернення різного числа для будь-яких двох існуючих об'єктів. Якщо об’єкт збирається сміттям, його ідентифікатор може бути перероблений.
Я можу сказати тут щось непопулярне: id()це досить спеціалізована вбудована функція, яка рідко використовується в бізнес-логіці. Тому я не бачу проблеми у використанні його як імені змінної у чіткій і добре написаній функції, де зрозуміло, що id не означає вбудовану функцію.
import this
idвбудований у будь-якому випадку. Це сказало, що мені знадобилося певний час, коли колега переоцінив listвбудовану локальну змінну. Тож загальне правило, яке згадують інші, все ще має сенс.
id- це вбудована функція в Python. Призначення значення idбуде замінено функцію. Найкраще або додати префікс як у, some_idабо використовувати його з іншої великої літери, як у ID.
Вбудована функція приймає єдиний аргумент і повертає ціле число для адреси пам'яті об'єкта, який ви передали (в CPython).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Інші відзначили , що це помилка, але я хочу , щоб розширити чому . Ось приклад, заснований на справжній історії. В основному я пишу клас, який приймає idпараметр, але потім намагаюся використовувати вбудований 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
Так? Де я намагаюся викликати інт? Це все вбудовані ...
Якби я назвав його badge_idабо id_, я б не мав цю проблему.
Оскільки python - це динамічна мова, зазвичай не годиться давати однойменній змінній та функції однакову назву. id () - це функція в python, тому рекомендується не використовувати змінну з назвою id. Зважаючи на це, це стосується всіх функцій, які ви можете використовувати ... змінна не повинна мати те саме ім'я, що і функція.