Существует ли соглашение об именах питонов для предотвращения конфликтов со стандартными именами модулей?

PEP 8 рекомендует использовать одно заключительное подчеркивание, чтобы избежать конфликтов с ключевыми словами python, но как насчет конфликтов с именами модулей для стандартных модулей python? Должен ли это быть единственным завершающим подчеркиванием?

Я представляю что-то вроде этого:

import time
time_ = time.time()

Ответы

Ответ 1

PEP 8, похоже, не обращается к нему напрямую.

Заключительное подчеркивание, очевидно, необходимо, когда вы сталкиваетесь с ключевым словом, потому что ваш код в противном случае поднимал бы SyntaxError (или, если вам действительно не повезло, компиляция означает нечто совершенно иное, чем вы предполагали).

Итак, даже в тех контекстах, где у вас есть атрибут класса, атрибут экземпляра, параметр функции или локальная переменная, которую вы хотите назвать class, вам нужно перейти вместо class_.

Но это не относится к time. И я думаю, что в этих случаях вы не должны postfix подчеркивать для time.

Прецедент для этого: у нескольких классов в stdlib есть методы или атрибуты данных с именем time (и ни один из них не имеет time_).


Конечно, есть случай, когда вы создаете имя в той же области, что и модуль (обычно это означает глобальную переменную или функцию). Тогда у вас есть гораздо больше возможностей для путаницы и скрытия возможности доступа к чему-либо в модуле time для остальной части текущей области.

Я думаю, что 90% времени, ответ будет "Это не должно быть глобальным".


Но это все еще оставляет другие 10%.

И также, когда ваше имя находится в ограниченном пространстве имен, но это пространство имен является локальной областью внутри функции, где вам нужно получить доступ к модулю time.

Или, может быть, в длинной сложной функции (которой у вас не должно быть ни одной, но... иногда вы это делаете). Если человеческому читателю было бы не очевидно, что time является локальным, а не модулем, это так же плохо, как запутывание интерпретатора.

Здесь, я думаю, что 99% оставшегося времени, ответ: "Просто выберите другое имя".

Например, посмотрите на этот код:

def dostuff(iterable):
    time = time.time()
    for thing in iterable:
        dothing(thing)
    return time.time() - time # oops!

Очевидным ответом здесь является переименование переменной start или t0 или что-то еще. Помимо решения проблемы, это также более содержательное имя.


Но это все равно оставляет 1%.

Например, существуют библиотеки, которые генерируют код Python из, скажем, спецификации протокола или интерфейса .NET или ObjC, где имена не находятся под вашим контролем; все, что вы можете сделать, это применить какое-то программное и недвусмысленное правило к переведенным именам. В этом случае я думаю, что правилом, которое добавляет _ к именам модулей stdlib, а также к ключевым словам, может быть хорошей идеей.

Возможно, вы можете найти другие примеры, в которых переменная не может быть просто переименована и должна (по крайней мере потенциально) жить в той же области, что и модуль time, и так далее. В любых таких случаях я бы пошел на суффикс _.