Generic proxy (that proxies methods like __iter__)
D HANNEY
spam2008 at nney.com
Wed Jan 27 09:41:40 EST 2010
>>> def show(opened):
... with opened as file:
... for line in file:
... print line.strip()
...
>>> show(open("test.txt"))
blah1
blah2
blah3
#
# Good! I wonder if I can do that with StringIO ...
#
>>> import StringIO
>>> show(StringIO.StringIO("blah1\nblah2\nblah3\n"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in show
AttributeError: StringIO instance has no attribute '__exit__'
#
# Oh dear ... I'll need to proxy it ...
#
>>> class IterNoGuardProxy(object):
... def __init__(self, t):
... self.t = t
... def __enter__(self):
... return self
... def __exit__(self, type, value, traceback):
... return False
... def __iter__(self):
... return self.t.__iter__()
...
>>> show(IterNoGuardProxy(StringIO.StringIO("blah1\nblah2\nblah3\n")))
blah1
blah2
blah3
>>>
#
# Great! That works well. Now I wonder if I can do it generically
# in a way that can proxy for ALL methods (including, but not limited
to, __iter__)
#
>>> class NoGuardProxy(object):
... def __init__(self, t):
... self.t = t
... def __enter__(self):
... return self
... def __exit__(self, type, value, traceback):
... return False
... def __getattr__(self):
... return self.t.__getattr__(self)
...
>>> show(NoGuardProxy(StringIO.StringIO("blah1\nblah2\nblah3\n")))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in show
TypeError: 'NoGuardProxy' object is not iterable
#
# Now I'm stuck.
# Can anyone help?
#
More information about the Python-list
mailing list