forked from yidao620c/python3-cookbook
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconsttype.py
More file actions
49 lines (37 loc) · 1.57 KB
/
consttype.py
File metadata and controls
49 lines (37 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Constant types in Python.
"""
__doc__ = """
This is a variation on "Constants in Python" by Alex Martelli, from which the
solution idea was borrowed, and enhanced according suggestions of Zoran Isailovski.
In Python, any variable can be re-bound at will -- and modules don't let you
define special methods such as an instance's __setattr__ to stop attribute
re-binding. Easy solution (in Python 2.1 and up): use an instance as "module"...
In Python 2.1 and up, no check is made any more to force entries in sys.modules
to be actually module objects. You can install an instance object there and take
advantage of its attribute-access special methods (e.g., as in this snippet, to
prevent type rebindings.
Usage:
import consttype
consttype.magic = 23 # Bind an attribute to a type ONCE
consttype.magic = 88 # Re-bind it to a same type again
consttype.magic = "one" # But NOT re-bind it to another type: this raises consttype._ConstError
del consttype.magic # Remove an named attribute
consttype.__del__() # Remove all attributes
"""
class _consttype:
class _ConstTypeError(TypeError):
pass
def __repr__(self):
return "Constant type definitions."
def __setattr__(self, name, value):
v = self.__dict__.get(name, value)
if type(v) is not type(value):
raise self._ConstTypeError("Can't rebind %s to %s" % (type(v), type(value)))
self.__dict__[name] = value
def __del__(self):
self.__dict__.clear()
import sys
sys.modules[__name__] = _consttype()