[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