[Python-ideas] Shorthand syntax for get/set/delattr (was Re: Dict-like object with property access)
Mathias Panzenböck
grosser.meister.morti at gmx.net
Mon Feb 6 02:07:55 CET 2012
On 02/05/2012 04:16 PM, Paul Moore wrote:
> 2012/2/5 Serhiy Storchaka<storchaka at gmail.com>:
>> 05.02.12 15:25, Carl M. Johnson написав(ла):
>>> On Feb 5, 2012, at 2:58 AM, yoav glazner wrote:
>>>> This does't work for properties:
>>> It's not that hard to make something that basically works with properties:
>>
>> del v['pop']
>> AttributeError: P instance has no attribute 'pop'
>>
>>
>>> In a real module, you'd probably want to be more thorough about emulating a __dict__ dictionary though by adding item() and keys() etc.
>>
>> It's impossible in general.
>>
>> class A:
>> def __getattr__(self, name):
>> return len(name)
>
>
>>>> class proxy:
> ... def __init__(self, orig):
> ... self._orig = orig
> ... def __getitem__(self, attr):
> ... return getattr(self._orig,attr)
> ...
>>>> class A:
> ... def __getattr__(self, name):
> ... return len(name)
> ...
>>>> a = A()
>>>> proxy(a)['hello']
> 5
>>>>
>
> Extending the proxy class to include setting, deleting, and various
> corner cases, is left as an exercise for the reader :-)
>
class attrs(object):
__slots__ = 'obj',
def __init__(self,obj):
self.obj = obj
def __getitem__(self, key):
try:
return getattr(self.obj, key)
except AttributeError:
raise KeyError(key)
def __setitem__(self, key, value):
try:
setattr(self.obj, key, value)
except AttributeError:
raise KeyError(key)
def __delitem__(self, key):
try:
delattr(self.obj, key)
except AttributeError:
raise KeyError(key)
def __contains__(self, key):
return hasattr(self.obj, key)
def get(self, key, default=None):
try:
return getattr(self.obj, key, default)
except AttributeError:
raise KeyError(key)
def keys(self):
return iter(dir(self.obj))
def values(self):
for key in dir(self.obj):
yield getattr(self.obj, key)
def items(self):
for key in dir(self.obj):
yield key, getattr(self.obj, key)
def __len__(self):
return len(dir(self.obj))
def __iter__(self):
return iter(dir(self.obj))
def __repr__(self):
return repr(dict(self))
More information about the Python-ideas
mailing list