The statement: var = property(lambda self: object())



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

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

格兰特的好奇心在于最后 4 行包含lambda。问题是:这是如何运作的?它们的意义,它们的结果是什么?你能用简单的方式展示这个陈述的例子吗?谢谢现在!

首先,我建议阅读有关属性的python文档。它们通常用于创建假属性。

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

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

property

内置的。它通常用作装饰器。该代码等效于以下内容,可能看起来更熟悉一些:

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()

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

它们看起来更像占位符 - 也许是不受支持的实现。 它们返回无用的对象。 当您需要非 None 值时,它们似乎很合适。

相关内容

最新更新