[Python-Dev] properties and block statement
Josiah Carlson
jcarlson at uci.edu
Tue Oct 18 21:56:32 CEST 2005
Antoine Pitrou <solipsis at pitrou.net> wrote:
>
>
> > What would this mythical block statement look like that would make
> > properties easier to write than the above late-binding or the subclass
> > Property recipe?
>
> I suppose something like:
>
> class C(object):
> x = prop:
> """ Yay for property x! """
> def __get__(self):
> return self._x
> def __set__(self, value):
> self._x = x
>
> and then:
>
> def prop(@block):
> return property(
> fget=block.get("__get__"),
> fset=block.get("__set__"),
> fdel=block.get("__delete__"),
> doc=block.get("__doc__", ""),
> )
>
> (where "@bargs" would be the syntax to refer to block args as a dict,
> the same way "**kargs" already exist)
You are saving 3 lines over the decorator/function approach at the cost
of possible confusion over blocks and an easily forgotten/not read @
just after an open paren.
Thanks, but I'll stick to the Property decorator, Property subclass,
property late bindings, or even a Property metaclass*, and not need to
modify Python syntax.
- Josiah
* Property metaclass in an embedded class definition:
class Property(type):
def __init__(*args):
pass
def __new__(cls, name, bases, dct):
return property(dct.get('get'),
dct.get('set'),
dct.get('delete'),
dct.get('__doc__', ''))
class foo(object):
class x(object):
__metaclass__ = Property
'hello'
def get(self):
try:
return self._x
except AttributeError:
self._x = 0
return 0
def set(self, value):
if value >= 5: raise ValueError("value too big")
self._x = value
def delete(self):
del self._x
More information about the Python-Dev
mailing list