__repr__ policy problem: should module be prefixed to output?
Pearu Peterson
pearu at cens.ioc.ee
Fri Dec 15 17:41:59 EST 2000
Hi,
On Fri, 15 Dec 2000, Pearu Peterson wrote:
> There is a solution to this repr string dilemma. For example,
> consider foo.py:
>
> # begin of file foo.py
> class A:
> def __init__(self,value):
> self.value = value
> def __repr__(self):
> return '%s.%s(%s)'%(self.__module__,
> self.__class__.__name__,
> self.value)
>
> exec 'import %s'%__name__ # this does the trick
> # (could it be done also in C extension
> # modules?)
>
> #eof foo.py
I now see several problems in this solution:
1) It does not work if 'from foo import A' is used
2) If module `foo' has local object with the name `foo', then it will be
overwritten.
So, it is not useful solution. 2) can be avoided by the module developer
but I don't see how the problem 1) could be avoided. Any ideas?
> And the answer to the original question is Yes.
For completeness, let me give another 'bad' solution where the answer to
the original question is No.
This solution re-wraps builtin function eval (which, I am pretty sure,
will not please you). But anyway, here is the result (sources are given
at the end of this message):
Python session:
>>> import foo
Warning: Built-in function "eval" is re-wrapped
>>> foo.A(1)
A(1)
>>> eval(repr(foo.A(1)))
A(1)
Another Python session:
>>> from foo import *
Warning: Built-in function "eval" is re-wrapped
>>> A(1)
A(1)
>>> eval(repr(A(1)))
A(1)
The main problem to this solution is that different modules may define
different objects with the same name. So, for generality, the answer
should be Yes.
In conclusion, I don't have a good solution. Just these two bad ones that
might be useful only in special cases.
Are there any better solutions to the repr string dilemma?
Regards,
Pearu
######### File evalhack.py
import sys,string
_eval = __builtins__['eval']
_register = {}
def eval(source,g=None,l=None):
if g is None: g = globals()
if l is None: l = g
try: return _eval(source,g,l)
except NameError:
v = sys.exc_value
o = v[0][string.find(v[0],"'")+1:-1]
if _register.has_key(o):
l[o] = _register[o].__dict__[o]
return _eval(source,g,l)
eval.__doc__ = _eval.__doc__
def register(module,*objs):
m = __import__(module)
for o in objs:
_register[o] = m
print 'Warning: Built-in function "eval" is re-wrapped'
__builtins__['eval'] = eval
######### EOF evalhack.py #######
######### File foo.py
class A:
def __init__(self,value):
self.value = value
def __repr__(self):
return '%s(%s)'%(self.__class__.__name__,self.value)
import evalhack
evalhack.register(__name__,'A')
######### eof foo.py
More information about the Python-list
mailing list