[Python-Dev] constant/enum type in stdlib

Steven D'Aprano steve at pearwood.info
Wed Nov 24 16:44:57 CET 2010


Nick Coghlan wrote:
> On Wed, Nov 24, 2010 at 10:30 PM, Michael Foord
> <fuzzyman at voidspace.org.uk> wrote:
>> Based on a non-exhaustive search, Python standard library modules currently
>> using integers for constants:
> 
> Thanks for that review. I think following up on the "NamedConstant"
> idea may make more sense than pursuing enums in their own right. 

Pardon me if I've missed something in this thread, but when you say 
"NamedConstant", do you mean actual constants that can only be bound 
once but not re-bound? If so, +1. If not, what do you mean?

I thought PEP 3115 could be used to implement such constants, but I 
can't get it to work...

class readonlydict(dict):
     def __setitem__(self, key, value):
         if key in self:
             raise TypeError("can't rebind constant")
         dict.__setitem__(self, key, value)
     # Need to also handle updates, del, pop, etc.

class MetaConstant(type):
     @classmethod
     def __prepare__(metacls, name, bases):
         return readonlydict()
     def __new__(cls, name, bases, classdict):
         assert type(classdict) is readonlydict
         return type.__new__(cls, name, bases, classdict)

class Constant(metaclass=MetaConstant):
     a = 1
     b = 2
     c = 3


What I expect is that Constant.a should return 1, and Constant.a=2 
should raise TypeError, but what I get is a normal class __dict__.

 >>> Constant.a
1
 >>> Constant.a = 2
 >>> Constant.a
2


-- 
Steven



More information about the Python-Dev mailing list