Ответ 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
, и так далее. В любых таких случаях я бы пошел на суффикс _
.