2012-12-07 1 views
21

Quelle est la convention de dénomination d'une variable référençant une classe en Python?Quelle est la convention de dénomination pour les références de classe 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 tout le monde nouveau au code sait qu'il est une classe et non une instance. Mais comme l'a écrit @poplitea, la référence bibliographique serait grande.

+3

ReferenceToClass est exactement le même que MyClass ici (sémantiquement). Les deux sont des variables qui font référence au même objet de classe. – Kos

Répondre

11

Le niveau de module, le second:

ReferenceToClass = MyClass

comme argument de la fonction, le premier:

reference_to_class = MyClass

+3

Références bibliographiques? – poplitea

+3

pep8 http://www.python.org/dev/peps/pep-0008/. Un alias de la classe se comporte exactement comme la classe, donc son nom devrait adhérer au même schéma que la dénomination de classe normale, je pense. – XORcist

+0

En tant qu'argument de fonction, le premier, principalement parce que vous ne pouvez pas savoir avec certitude que vous obtiendrez réellement un descendant de type (c'est-à-dire une classe). –

2

I traiter de la même comme une variable d'instance, qui pep8 définit comme en utilisant lowercase_underscore_style. (Minuscule, avec des mots séparés par des underscores que nécessaire pour améliorer la lisibilité.)

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

4

tl; dr: pour les noms globaux/publics utilisent AllCaps comme Xorcist dit:

class Logger: 
    pass 

AliasLogger = Logger 

Pour la fonction paramètres et locaux de fonction, préciser que vous avez affaire à l'objet de classe avec un nom descriptif comme celui-ci:

def some_func(logger_class): 
    pass 

ou quelque chose le long des lignes

def some_func(my_class_classobj): 
    pass 

lorsque le mot "class" est en fait dans votre classname. Pour classobj, voir également class_ et klass.


Analyse/Motivation (version longue)

Pas de lecture approfondie, mais un coup d'oeil PEP 8 ne semble pas être explicite sur ce (guide de style python ni Google pour cette matière). Comme un nom de variable est probablement juste un autre name binding en python, à mon avis cela n'a pas vraiment d'importance si 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 de module références « alias » devrait adhérer à votre niveau de nommage des classes, probablement AllCaps:

class MyClass(object): 
    pass 

# good 
ReferenceToClass = MyClass 

Cependant, quand il vient au paramètre et les noms de variables, soi-disant lowercase_underscores devrait appliquer , droite? Je ne suis pas content avec cela, car cela vous poussera dans l'ambiguïté de référence de l'instance par rapport à la classe. Il se peut qu'un nom en minuscules soit une tentative pour indiquer que l'objet est une instance.Pour cette question, je vous recommande postfixant tout-minuscules, les noms de variables-référencement classe avec le suffixe « class », comme ceci:

class Logger(object): 
    pass 

def function_expecting_class_reference(logger_class): 
    pass 

Je rebaptisés votre exemple de classe MyClass-Logger parce que dans les scénarios réels que quelques classes name contient la chaîne "class". Cependant, dans ce dernier cas, je propose d'éviter l'ambiguïté avec la dénomination descriptive encore une fois. 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 je tendance à prendre est d'utiliser le suffixe klass, comme my_class_klass. Ce n'est pas tout le monde qui semble avoir ce dernier, mais de toute façon, je n'ai pas encore testé si le premier serait meilleur.

+1

+1 pour suggérer le suffixe. J'utilise souvent un suffixe "_ref" pour clarifier et améliorer la lisibilité du code lors de l'affectation d'une variable à une référence d'objet. –

Questions connexes