Skip to content

Commit f8b9f8d

Browse files
committed
do not allow assigning to names critical to functionality; change printing to __repr__
1 parent 1898251 commit f8b9f8d

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

unpythonic/env.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)