C macros in Python.
Alex Martelli
aleaxit at yahoo.com
Wed Oct 18 03:55:13 EDT 2000
More information about the Python-list mailing list
Wed Oct 18 03:55:13 EDT 2000
- Previous message (by thread): C macros in Python.
- Next message (by thread): C macros in Python.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
"Quinn Dunkan" <quinn at zloty.ugcs.caltech.edu> wrote in message news:slrn8updfp.ero.quinn at zloty.ugcs.caltech.edu... > On Tue, 17 Oct 2000 11:30:35 +0100, Burkhard Kloss <bk at xk7.com> wrote: > >> On a different, but related, topic...I sometimes miss C's #define > >> macro. There doesn't seem to be any similar thing in Python capable of > >> creating identifiers which are 1) constant, that is, "read only", and 2) > >> truly global in scope. > >How about defining a function that returns the value? that would make it > >nicely read-only. > > > >define pi(): return 3.14.... > > pi = 3 > > will defeat that nicely. > > If you want something to be constant in python, don't reassign it. Not that > hard, now is it? :) And if you want something "truly global" you could shove > it into __builtins__, which is great not only for confusing other people but > also increasing job security. And that's why you want globals in the first > place, right? :) I think the "truly global in scope" can indeed be obtained by the shove-into-__builtins__ approach, and accidental modifications could be stopped by having a dot in the name...: >>> const.define('pi', 3.1415926) >>> const.pi 3.1415926 >>> const.pi = 3 <some exception...> __builtin__.const would obviously have to be an instance of some suitable class (which you could put in place in your site.py), e.g.: In site.py, or wherever...: class Const: def define(self, name, value): if self.__dict__.has_key(name): raise KeyError, "Can't redefine constant %s"%name self.__dict__[name] = value def __setattr__(self, name,value): if self.__dict__.has_key(name): raise KeyError, "Can't redefine constant %s"%name raise KeyError, "Use const.define to define constants" import __builtin__ __builtin__.const = Const() Of course, we might not want this specific separation of define and __setattr__ -- it's just one of several roughly equivalent possibilities. Anyway, with this design...: >>> const.define('pi',3.1415962) >>> print const.pi 3.1415962 >>> const.pi = 3 Traceback (innermost last): File "<pyshell#32>", line 1, in ? const.pi = 3 File "<pyshell#23>", line 8, in __setattr__ raise KeyError, "Can't redefine constant %s"%name KeyError: Can't redefine constant pi >>> Of course, it IS possible for an errant client-code module to import __builtin__ then set __builtin__.const to refer to some other object, but I would not particularly worry about this happening by accident:-). Alex
- Previous message (by thread): C macros in Python.
- Next message (by thread): C macros in Python.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list