Ответ 1
На уровне модуля второй:
ReferenceToClass = MyClass
В качестве аргумента функции первое:
reference_to_class = MyClass
Что такое соглашение об именах для переменной, ссылающейся на класс в Python?
class MyClass(object):
pass
# which one is correct?
reference_to_class = MyClass
# or
ReferenceToClass = MyClass
Вот еще один пример, который напоминает мою ситуацию:
# cars.py
class Car(object):
pass
class Sedan(Car):
pass
class Coupe(Car):
pass
class StatonWagon(Car):
pass
class Van(Car):
pass
def get_car_class(slug, config):
return config.get(slug)
# config.py
CONFIG = {
'ford-mustang': Coupe,
'buick-riviera': Coupe,
'chevrolet-caprice': Sedan,
'chevy-wan' Van:
'ford-econoline': Van
}
# main.py
from config.py import CONFIG
from cars import get_car_class
MyCarClass = get_car_class('buick-riviera')
my_car = MyCarClass()
Я бы предпочел ReferenceToClass, что все, новые для кода, знают его как класс, а не экземпляр. Но, как писал @poplitea, литературная ссылка была бы замечательной.
На уровне модуля второй:
ReferenceToClass = MyClass
В качестве аргумента функции первое:
reference_to_class = MyClass
tl; dr: для глобальных/общедоступных имен используйте AllCaps
, как XORcist сказал:
class Logger:
pass
AliasLogger = Logger
Для параметров функций и локалей функций дайте понять, что вы имеете дело с объектом класса с описательным именем, подобным этому:
def some_func(logger_class):
pass
или что-то вдоль линий
def some_func(my_class_classobj):
pass
когда слово "class"
фактически находится в вашем имени класса. Для classobj
см. Также class_
и klass
.
Анализ/Мотивация (длинная версия)
Нет подробного чтения, но с первого взгляда PEP 8, похоже, не является явным в этом отношении (ни руководство по стилю python для Google для этого материя).
Так как имя переменной, вероятно, просто еще одно - привязка имени в python, на мой взгляд, на самом деле не имеет значения, связываете ли вы это имя с блоком определения или позже с знаком =
равным значению для некоторого объекта.
Для этого я согласен с XORcist в том, что ссылки на "уровень псевдонима" на уровне модуля должны соответствовать стандарту именования классов, возможно, AllCaps:
class MyClass(object):
pass
# good
ReferenceToClass = MyClass
Однако, когда дело доходит до имен параметров и переменных, предположительно lowercase_underscores
должен применяться, правильно? Я недоволен только этим, так как это подтолкнет вас к неоднозначности ссылок на экземпляр vs class. Существует вероятность того, что все строчные имена могут быть попыткой намекнуть, что объект является экземпляром. В этом отношении я рекомендую постфинировать ваши имена с именами всех строчных имен, ссылающихся на класс, с суффиксом "класс", например:
class Logger(object):
pass
def function_expecting_class_reference(logger_class):
pass
Я переименовал ваш пример класса MyClass
в Logger
, потому что в реальных сценариях только несколько имен классов содержат строку "class"
. Однако в этом последнем случае я предлагаю еще раз избежать двусмысленности с описательным наименованием. Например, вы можете использовать суффикс classobj
:
class MyClass(object):
pass
def function_expecting_class_reference(another_param, my_class_classobj):
ReferenceToClass = MyClass
Другая альтернатива, которую я имею в виду, - это использовать суффикс klass
, например my_class_klass
. Не все, кажется, получают последнее, но в любом случае я еще не проверял, смогут ли они получить лучшее.
Я рассматриваю его так же, как переменная экземпляра, которую PEP8 определяет как использующий lowercase_underscore_style. (нижний регистр, со словами, разделенными символами подчеркивания, по мере необходимости, чтобы улучшить читаемость.)