2009-12-10 15 views
2

Le module python suivant est destiné à servir de base pour la gestion "constante" en python. Le cas d'utilisation est la suivante:Demande de commentaires: usine de classe python pour le groupe de valeurs constantes

  • un groupe des constantes (essentiellement des « noms ») qui appartiennent en même temps que leurs valeurs dans un dictionnaire
  • avec ce dictionnaire lié à la variable de classe d'une classe est créée et Exécuter- instantinated temps
  • les attributs de cette classe sont les noms des constantes, leurs valeurs sont les constantes elles-mêmes

code:

class ConstantError(Exception): 
    def __init__(self, msg): 
     self._msg = msg 

class Constant(object): 
    def __init__(self, name): 
     self._name = name 
    def __get__(self, instance, owner): 
     return owner._content[self._name] 
    def __set__(self, instance, value): 
     raise ConstantError, 'Illegal use of constant' 

def make_const(name, content): 
    class temp(object): 
     _content = content 
     def __init__(self): 
      for k in temp._content: 
       setattr(temp, k, Constant(k)) 

    temp.__name__ = name + 'Constant' 
    return temp() 

num_const = make_const('numeric', { 
    'one': 1, 
    'two': 2 
}) 

str_const = make_const('string', { 
    'one': '1', 
    'two': '2' 
}) 

Utilisation:

>>> from const import * 
>>> num_const 
<const.numericConstant object at 0x7f03ca51d5d0> 
>>> str_const 
<const.stringConstant object at 0x7f03ca51d710> 
>>> num_const.one 
1 
>>> str_const.two 
'2' 
>>> str_const.one = 'foo' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "const.py", line 16, in __set__ 
    raise ConstantError, 'Illegal use of constant' 
const.ConstantError 
>>> 

S'il vous plaît, commenter la conception, la mise en œuvre et de la correspondance aux directives de codage de python.

Répondre

3

Dans le même esprit que Kugel, mais en notant que collections.namedtuple est très similaire .. c'est un tuple, donc immuable, et il a des noms de champs. Namedtuple a été introduit dans Python 2.6.

Voici comment vous pouvez utiliser namedtuple:

import collections 

def make_constants(variables): 
    n = collections.namedtuple('Constants', variables.keys()) 
    return n(**variables) 

c = make_constants({"a": 2, "b": 76}) 
print c 
# the output is: 
# Constants(a=2, b=76) 
1

La façon la plus pythonique est (pour moi):

my_fav_fruits = ('Apple', 'Orange', 'Strawberry', 'Chocolate Pudding') 
lucky_numbers = (13, 7, 4, 99, 256) 

Votre conception semble apporter quelques autres langues en python fonctionnalités. Vous pourriez faire une substitution de l'interface de Java de la même manière. Définissez une classe qui lance des exceptions sur n'importe quel appel de méthode et en tire des classes enfant et les implémente. Je semble trouver qu'il n'y a aucun intérêt à faire des choses comme ça. Mes 'constantes' fonctionnent aussi bien que le comportement de type canard sans interfaces (les docs de python sont pleins d'objets ressemblant à des fichiers).

+0

+1 pour votre raison, en Python, il se résume souvent à utiliser simplement la bonne combinaison de Dicts, tuples et des listes et vous avez terminé. – u0b34a0f6ae

+0

"Votre design semble apporter d'autres fonctionnalités de langages en python." Ceci est intentionnel :-) Fondamentalement, j'ai besoin de quelque chose qui est assez proche des macros C. Imaginez une fonction C avec un argument "bit field", que vous voulez appeler via 'ctypes'. Alors c'est sympa d'avoir des symboles pour les 'ou 'au lieu des nombres. –

+0

@ht: vous devez vouloir dire bitwise ou c'est '|' en Python.Notez que les ensembles et les bitflags se comportent de la même manière avec l'opérateur '|' - donc en Python, vous pouvez implémenter ces drapeaux de combinaison comme ints ou sets si vous le souhaitez. – u0b34a0f6ae

1

Je pense qu'un idiome commun est

class numericConstant: 
    One = 1 
    Two = 2 

#usage 
print (numericConstant.One + numericConstant.Two) 

L'inconvénient est qu'il n'empêche pas quelqu'un écraser les valeurs « constantes », à savoir

numericConstant.One = 7 #oops... 

mais en accord avec la philosophie des «adultes consentants» de Python, pourquoi prévenir dans un forcef Quelque chose que vous ne voudriez pas faire en premier lieu? ...

2

Votre solution semble plutôt sur-machinée. Fais juste un module et jette tes constantes avec des majuscules. Nous sommes tous les adultes ...

#myconstants.py 

ONE = 1 
TWO = 2 
THREE = 3