声明:var = property(lambda self:object())

时间:2014-02-18 20:49:19

标签: python lambda

我沉迷于阅读图书馆。我喜欢他们的代码构建方式,美观,最重要:可读。我正试图通过这样做来学习。但是,有时这样的行:

something = property(lambda self: object())
抓住我的眼睛!

我在_socket.py和这个班级里面:

class error(Exception):
    """ Base class for I/O related errors. """
    def __init__(self, *args, **kwargs): # real signature unknown
        pass

    @staticmethod # known case of __new__
    def __new__(S, *more): # real signature unknown; restored from __doc__
        """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
        pass

    def __reduce__(self, *args, **kwargs): # real signature unknown
        pass

    def __str__(self): # real signature unknown; restored from __doc__
        """ x.__str__() <==> str(x) """
        pass

    characters_written = property(lambda self: object()) # default
    errno = property(lambda self: object()) # default
    filename = property(lambda self: object()) # default
    strerror = property(lambda self: object()) # default

授予好奇心超过了包含lambda的最后4行。问题是:它是如何工作的?他们的意思是什么,结果如何?你能用简单的方法展示一下这个陈述的例子吗? 谢谢你!

3 个答案:

答案 0 :(得分:2)

首先,我建议阅读the python documentation about properties。它们通常用于创建伪属性。

errno = property(lambda self: object()) # default

在您的情况下,您只为此属性定义了一个getter(没有删除器的setter),因此errno是只读的。在每次阅读时,它都会返回一个全新的object。这可能不是很有意义,但库的其余部分可能期望有一个errno变量。

答案 1 :(得分:1)

property is a built-in。它通常用作装饰器。该代码与此相当,可能看起来更为熟悉:

class error(Exception):
    #...
    @property
    def characters_written(self):
        return object()

    @property
    def errno(self):
        return object()

    @property
    def filename(self):
        return object()

    @property
    def strerror(self):
        return object()

尽管如此,它看起来并不是特别有用。这意味着每次尝试在此错误类的实例上检索任何这些属性时,您将获得一个新的唯一对象实例。

答案 2 :(得分:0)

它们看起来更像是占位符 - 可能是不受支持的实现。他们返回无用的东西。当你需要一个非None值时,它们似乎是合适的。