Что такое соглашение об именах для ссылок класса Python

Что такое соглашение об именах для переменной, ссылающейся на класс в 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, литературная ссылка была бы замечательной.

Ответ 1

На уровне модуля второй:

ReferenceToClass = MyClass

В качестве аргумента функции первое:

reference_to_class = MyClass

Ответ 2

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. Не все, кажется, получают последнее, но в любом случае я еще не проверял, смогут ли они получить лучшее.

Ответ 3

Я рассматриваю его так же, как переменная экземпляра, которую PEP8 определяет как использующий lowercase_underscore_style. (нижний регистр, со словами, разделенными символами подчеркивания, по мере необходимости, чтобы улучшить читаемость.)

http://www.python.org/dev/peps/pep-0008/#id34