[Python-Dev] constant/enum type in stdlib

Benjamin Peterson benjamin at python.org
Wed Nov 24 17:32:56 CET 2010


2010年11月24日 Steven D'Aprano <steve at pearwood.info>:
> 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__.

The construction namespace can be customized, but class.__dict__ must
always be a real dict.
-- 
Regards,
Benjamin


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /