Является ли использование встроенного имени функции в качестве идентификатора атрибута или метода плохой практикой?

Я знаю, что никогда нельзя использовать имена встроенных функций в качестве идентификаторов переменных.

Но есть ли причины не использовать их в качестве идентификаторов атрибутов или методов?

Например, безопасно ли писать my_object.id = 5 или определять метод экземпляра dict в моем собственном классе?


person max    schedule 02.02.2012    source источник
comment
По теме: 'id' - неправильное имя переменной в Python   -  person Piotr Dobrogost    schedule 02.02.2012


Ответы (4)


Это не запутает интерпретатор, но может запутать людей, читающих ваш код. Следует избегать ненужного использования встроенных имен для атрибутов и методов.

Еще один неприятный эффект заключается в том, что встроенные функции затенения сбивают с толку средства выделения синтаксиса в большинстве редакторов с поддержкой Python (vi, emacs, pydev, idle и т. Д.). Кроме того, некоторые инструменты lint предупреждают об этой практике.

person Raymond Hettinger    schedule 02.02.2012

Да, это плохая практика. Это может не сразу что-нибудь сломать, но все равно ухудшит читаемость кода.

Чтобы выборочно процитировать PEP20:

Красивое лучше, чем уродливое.
Простое лучше, чем сложное.
Читаемость важна.
Если реализацию трудно объяснить, это плохая идея.

Увидев вызов myobject.dict(), было бы естественно предположить, что он вернет myobject.__dict__, или что myobject.id() вернет то же самое, что и id(myobject)

Они могут обнаружить, что они неправы; но это потребует времени и усилий и, вероятно, приведет к некоторым ошибкам, пока они это выяснят. Вызов атрибута myobject.object_id_number намного длиннее, но проясняет, что он отличается от id(myobject)

person James Polley    schedule 02.02.2012

Нет, нормально. Поскольку требуется ссылка на объект, невозможно заставить их затенять встроенный.

person Ignacio Vazquez-Abrams    schedule 02.02.2012
comment
Итак, я могу использовать любой действительный идентификатор в качестве имени атрибута, кроме идентификатора, начинающегося с __, или идентификатора, идентичного ключевому слову? - person max; 02.02.2012
comment
вы можете использовать любое, включая __something или ключевое слово. Что ж, некоторые с __ имеют особое значение. - person Johan Lundberg; 02.02.2012
comment
Вы можете начинать их с __, если они также заканчиваются на __. Обратите внимание, что Python использует многие из них для своих собственных целей (например, __dict__, __init__ и __new__). - person Ignacio Vazquez-Abrams; 02.02.2012
comment
Есть ли правило, что если они заканчиваются на __, они не искажаются? - person Johan Lundberg; 02.02.2012
comment
@ IgnacioVazquez-Abrams: ну, именно поэтому я подумал, что не должен их использовать (кто знает, какие из них используются для собственных целей языка). И почему, если я рискнул ими воспользоваться, я должен закончить их знаком __? - person max; 02.02.2012
comment
comment
Вам вообще не следует начинать их с __. __foo испортились, и это не проблема, если это частная собственность. __foo__ означает, что это внутреннее устройство Python. В этом нет проблем, но это дурной тон. - person Lennart Regebro; 02.02.2012
comment
зависит от того, что вы имеете в виду под словом «штраф». Будет ли код работать? Конечно. Является ли использование встроенных имен плохой практикой и может ли привести к путанице? Да, и этого должно быть достаточно для того, чтобы кто-либо избегал использования встроенных типов / функций в качестве имен переменных. - person icdevppl; 28.08.2017
comment
@icdevppl: Даже как имя атрибута, как задается вопрос? - person Ignacio Vazquez-Abrams; 28.08.2017

Я часто возвращаюсь к функциям, когда входные переменные имитируют встроенные функции Python. Например, слово bytes является встроенным в python, но рассмотрим служебную библиотеку, которая анализирует байты:

def parse_bytes(bytes):
    pass

Я бы сказал, что у него отличная читаемость, но линтерам pep8 это не нравится. Вместо этого я мог бы сделать

def parse_bytes(bytearray):
    pass

def parse_bytes(somebytes):
    pass

Или используйте подсказку типа

def parse_bytes(b: bytes):
    pass

Но все это кажется еще хуже. То же самое происходит, если имя вашей переменной _5 _...

В конце дня я обычно использую somebytes

person Adam Hughes    schedule 26.02.2020
comment
Почему не bytes_? - person machinekoder; 06.10.2020