Quelle est la convention de dénomination pour une variable référençant une classe en Python?
class MyClass(object):
pass
# which one is correct?
reference_to_class = MyClass
# or
ReferenceToClass = MyClass
Voici un autre exemple qui ressemble à ma situation:
# 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()
Je préférerais ReferenceToClass, que toute personne nouvelle dans le code sache que c'est une classe et non une instance. Mais comme l'a écrit @poplitea, la référence bibliographique serait formidable.
Au niveau du module, le second:
ReferenceToClass = MyClass
Comme argument de fonction, le premier:
reference_to_class = MyClass
tl; dr : pour les noms globaux/publics, utilisez AllCaps
comme XORcist l'a dit:
class Logger:
pass
AliasLogger = Logger
Pour les paramètres de fonction et les fonctions locales, indiquez clairement que vous traitez l'objet classe avec un nom descriptif comme ceci:
def some_func(logger_class):
pass
ou quelque chose dans le sens
def some_func(my_class_classobj):
pass
quand la Parole "class"
est en fait dans votre nom de classe. Pour classobj
, voir aussi class_
et klass
.
Analyse/Motivation (version longue)
Pas de lecture approfondie, mais en un coup d'œil PEP 8 ne semble pas être explicite à ce sujet (ni le guide de style de google python d'ailleurs).
Puisqu'un nom de variable est probablement juste un autre liaison de nom en python, à mon avis, peu importe que vous liez ce nom avec le bloc de définition ou plus tard avec le =
signe égal à un objet.
Pour cela, je suis d'accord avec XORcist dans ce niveau, les références "alias" au niveau du module doivent adhérer à la norme de dénomination de votre classe, probablement AllCaps:
class MyClass(object):
pass
# good
ReferenceToClass = MyClass
Cependant, en ce qui concerne les noms de paramètres et de variables, soi-disant lowercase_underscores
devrait s'appliquer, non? Je ne suis pas satisfait de cela, car cela vous poussera dans l'ambiguïté de référence de l'instance contre la classe. Il est possible qu'un nom tout en minuscule soit une tentative d'indiquer que l'objet est une instance. D'ailleurs, je recommande de postfixer vos noms de variables de référence de classe tout en minuscules avec le suffixe "class", comme ceci:
class Logger(object):
pass
def function_expecting_class_reference(logger_class):
pass
J'ai renommé votre exemple de classe MyClass
en Logger
car dans les scénarios réels, seul un nom de classe contient la chaîne "class"
. Cependant, dans ce dernier cas, je propose d'éviter encore une fois l'ambiguïté avec la dénomination descriptive. Par exemple, vous pouvez utiliser un suffixe classobj
:
class MyClass(object):
pass
def function_expecting_class_reference(another_param, my_class_classobj):
ReferenceToClass = MyClass
Une autre alternative que j'ai tendance à utiliser est d'utiliser le suffixe klass
, comme my_class_klass
. Tout le monde ne semble pas avoir le dernier, mais de toute façon je n'ai pas encore testé s'ils amélioreraient le premier.
Je la traite de la même manière qu'une variable d'instance, que PEP8 définit comme utilisant lowercase_underscore_style. (en minuscules, les mots étant séparés par des traits de soulignement si nécessaire pour améliorer la lisibilité.)