CapWords conventions: get_MyClass ou get_my_class
C'est un style conventions question.
PEP8 convention pour une définition de classe serait quelque chose comme
class MyClass(object):
def __init__(self, attri):
self.attri = attri
Dire si je veux écrire un module dont l'étendue est fonction qui prend certaines données, les traite, puis crée une instance de Maclasse.
PEP8 dit que mes définitions de fonction doit avoir lowercase_underscore les noms de style, comme
def get_my_class(arg1, arg2, arg3):
pass
Mais mon inclination serait à préciser que je parle de MyClass instances comme
def get_MyClass(arg1, arg2, arg3):
pass
Pour ce cas, il semble carrément évident que my_class et MyClass sont liées, mais il ya certains cas où il n'est pas si évident. Par exemple, je suis de l'extraction de données à partir d'une feuille de calcul et un SpreadsheetColumn classe qui prend la forme d'une position d'attribut et d'une liste de données d'attribut. Pourtant, si vous ne le saviez pas, je vous parlais d'une instance de la SpreadsheetColumn classe, vous pourriez penser que je parle d'un raw colonne de cellules comme ils peuvent apparaître dans une feuille Excel.
Je me demande si c'est raisonnable de le violer PEP8 à utiliser get_MyClass
. Cours de Python, je ne veux pas créer une habitude pour un mauvais convention de nommage.
J'ai cherché PEP8 et de Débordement de Pile et de ne pas le voir tout ce qui a abordé la question.
get_SpreadsheetColumn()
? Ne pas get_column()
fonctionne tout aussi bien? Décrire ce que l'objet représente dans le nom de la fonction, non pas de quel type il est.Le problème dans mon cas c'est que j'ai la feuille de calcul complète de coordonnées qui décrivent une mise en page sur une page. J'ai donc pu parler d'une colonne dans la feuille de calcul, une colonne de coordonnées ou d'une colonne dans la mise en page finale. Dans mon cas, c'est une distinction que les questions
Je ne voudrais pas utiliser get_MyClass (), parce que "Maclasse", c'est la classe, pas l'instance. Lors de la première lecture get_MyClass() ne serait pas un MyClass usine, mais serait plutôt une sorte de décorateur qui, sur la base des informations d'exécution, retourné une classe dérivée de MyClass (ou a été MyClass).
Point valide.
OriginalL'auteur Ben Mordecai | 2013-01-25
Vous devez vous connecter pour publier un commentaire.
En fonction de l'utilisation de la fonction, il pourrait être plus approprié pour le transformer en un
classmethod
oustaticmethod
. Puis c'est l'association avec leclass
est clair, mais vous ne vous sentez pas à l'encontre des conventions de nommage.par exemple:
Merci, je pense que c'est le chemin à parcourir.
C'est la voie à suivre pour d'autres constructeurs. Mais ceux-ci sont en fait assez rares. Beaucoup plus souvent, vous n'avez pas vraiment besoin d'un
MyClass
ouSpreadsheetColumn
instance en premier lieu. Python est conçu autour de duck-typing, et c'est généralement (pas toujours, mais souvent) la bonne réponse.OriginalL'auteur mgilson
Prenons un peu de recul. Habituellement, vous ne voulez pas faire ce à tous les, de sorte que la convention de nommage est le cadet de vos soucis.
D'abord, normalement, vous n'avez pas de soins de ce que l'effectif de la classe ou de type est une chose. C'est ce que duck-typing est tout au sujet. Vous ne voulez pas un
SpreadsheetColumn
exemple, vous voulez quelque chose que vous pouvez utiliser comme une colonne de calcul. Il peut être une instance deSpreadsheetColumn
, ou d'une sous-classe, ou de certains de la classe proxy, ou de certaines de classe fantaisie pour les tests, quel qu'il soit, vous ne vous inquiétez pas, aussi longtemps que il ressemble et fonctionne comme une colonne.Avis que, même en statique des langues comme Java et C#, usine des fonctions (ou des objets) ne font généralement pas de créer une instance spécifique d'un classe, ils créent une instance de toute classe qui implémente une interface spécifique. En Python, qui est généralement implicite. (Et quand il ne l'est pas, c'est généralement parce que vous êtes en utilisant quelque chose comme PIC ou Tordu, et vous devez suivre leur style de codage pour les protocoles ou des interfaces.)
Donc, votre usine de fonction doit être appelée
get_column
, pasget_SpreadsheetColumn
.Lorsque la fonction est de plus en plus un "autre constructeur" d'une usine, puis mgilson la réponse est le chemin à parcourir. Voir
chain()
etchain.from_iterable()
dansitertools
d'une bonne bibliothèque standard exemple.Mais remarquez que ce n'est pas très commun dans la bibliothèque standard, les plus populaires, les modules sur PyPI, etc. Et il y a une bonne raison. Généralement, vous pouvez utiliser un seul constructeur par défaut les paramètres, paramètres de mot clé, ou, au pire,
*args
et**kwargs
. Si cela fait de l'API trop de confusion pour les lecteurs humains, ou trop ambiguë pour le code, c'est quand vous avez besoin d'un autre constructeur. Autrement, vous ne pouvez pas.Parfois, vous avez vraiment ne besoin d'une usine qui fabrique des objets d'un type concret, et que le type de béton est une partie de l'interface à laquelle l'appelant a besoin de les connaître. Comme je l'ai mentionné ci-dessus, c'est assez rare, même dans les langages statiques, et c'est encore plus rare en Python, mais il l'entend. Et puis, vous avez vraiment besoin d'une réponse à votre question initiale.
Dans ce cas, je pense que je serait nom de la fonction de quelque chose de laid et inhabituel comme
get_MyClass
ouget_MyClass_instance
. Il devrait tenir le coup immédiatement, parce que n'importe qui à la lecture de mon code aurez probablement besoin de comprendre pourquoi je suis explicitement l'obtention d'unMyClass
au lieu d'unthing
afin de comprendre le reste de mon code.Je suis de la génération du XML(ish) les fichiers exportés à partir d'une propriété industrielle de l'écran tactile interface graphique de l'application, l'analyse dans une forme logique, l'extraction d'objets utiles pour être utilisés comme modèles. Ensuite, j'ai une feuille de calcul où l'utilisateur spécifie les paramètres spécifiques à ce projet, et je créer des lots de fichiers XML qui peut importer dans le programme. Dans l'ensemble je me sens comme la forme a très peu de flexibilité. Je ne connais pas de cas où j'en aurais besoin pour traiter un colvert comme un canard. Qu'en pensez-vous?
Je ne suis pas sûr de ce que exactement à votre modèle d'objet est ici, mais je pense que vous êtes en train de dire que vous avez des choses comme
XMLDocument
etXMLNode
etSpreadsheetCell
pour laquelle il n'y a aucune raison pour laquelle vous pourriez jamais avoir une compatible mais de type différent. Mais que penser de l'essai. Si votre feuille de calcul code travaillé sur n'importe quel objet avec le droit de l'interface, vous pouvez passer dans la maquette des cellules, ce qui peut être beaucoup plus facile de générer à partir de l'unité de test de code de réelsSpreadsheetCell
objets. Je ne suis pas sûr de savoir si c'est utile ou pas, mais c'est dur sans plus de détails...OriginalL'auteur abarnert