Creating properties using a lambda getter and setter

I have something like this:

class X():
    def __init__(self):
        self.__name = None

    def _process_value(self, value):
        # do something
        pass

    def get_name(self):
        return self.__name

    def set_name(self, value):
        self.__name = self._process_value(value)

    name = property(get_name, set_name)

Can I replace get_nameit set_namewith lambda functions?

I tried this:

name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))

but the compiler does not like my setter function.

+5
source share
2 answers

Your problem is that the lambda body should be an expression and the assignment should be an expression (strong deep difference in Python). If you insist on committing lambda, you will encounter many such cases and find workarounds (usually one, although not always), for example, in this case:

name = property(lambda self: self.__name, 
                lambda self, value: setattr(self, 
                                            '_X__name',
                                            self.process_value(value)))

. setattr ( , , lambda), ( , , lambda).

: ( __name _X__name, X), , setattr, Pyhon , .

+19

list, __setitem__, :

class Position(list):
    def __init__(self,x=0, y=0, z=0):
        super(Position, self).__init__((x,y,z))

    x = property(lambda self: self[0],
                 lambda self,value: self.__setitem__(0, value))
    y = property(lambda self: self[1],
                 lambda self,value: self.__setitem__(1, value))
    z = property(lambda self: self[2],
                 lambda self,value: self.__setitem__(2, value))
+1

All Articles