Почему плохо назвать переменную 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, которое говорит, что не делай этого?
В PEP 8 - Руководство по стилю для кода Python в разделе « Описательный» появляется следующее руководство : Стили именования :
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, maxobjectidфункция, возвращающая адрес памяти объекта, является деталью реализации 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
А? Где я пытаюсь вызвать Int? Это все встроенные ...
Если бы я назвал это badge_idили id_, у меня не было бы этой проблемы.
Поскольку python является динамическим языком, обычно не рекомендуется давать имя переменной и функции с одинаковым именем. id () - это функция в python, поэтому рекомендуется не использовать переменную с именем id. Учитывая это, это относится ко всем функциям, которые вы можете использовать ... переменная не должна иметь того же имени, что и функция.