@@ -42,17 +42,22 @@ class env:
4242 When the `with` block exits, `e2` forgets all its bindings. The `e2`
4343 instance itself will remain alive due to Python's scoping rules.
4444 """
45+ # do not allow bindings that would break functionality.
46+ reserved_names = ("_env" , "set" , "clear" )
47+
4548 def __init__ (self , ** bindings ):
4649 self ._env = {}
47- for name ,value in bindings .items ():
48- self . _env [ name ] = value
50+ for name , value in bindings .items ():
51+ setattr ( self , name , value )
4952
5053 # item access by name
5154 # https://docs.python.org/3/reference/datamodel.html#object.__setattr__
5255 # https://docs.python.org/3/reference/datamodel.html#object.__getattr__
5356 def __setattr__ (self , name , value ):
5457 if name == "_env" : # hook to allow creating _env directly in self
5558 return super ().__setattr__ (name , value )
59+ if name in self .reserved_names :
60+ raise AttributeError ("cannot overwrite reserved name '{:s}'; complete list: {}" .format (name , self .reserved_names ))
5661# value = self._wrap(name, value) # for "e.x << value" rebind syntax.
5762 self ._env [name ] = value # make all other attrs else live inside _env
5863
@@ -92,7 +97,7 @@ def __exit__(self, exctype, excvalue, traceback):
9297 self .clear ()
9398
9499 # pretty-printing
95- def __str__ (self ):
100+ def __repr__ (self ):
96101 bindings = ["{:s}={}" .format (name ,repr (value )) for name ,value in self ._env .items ()]
97102 return "<env object at 0x{:x}: {{{:s}}}>" .format (id (self ), ", " .join (bindings ))
98103
0 commit comments