web-dev-qa-db-fra.com

Quelle est la convention de dénomination pour les références de classe Python

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.

33
Peter Hudec

Au niveau du module, le second:

ReferenceToClass = MyClass

Comme argument de fonction, le premier:

reference_to_class = MyClass

18
XORcist

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.

8
n611x007

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é.)

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

2
Corey Goldberg