2014-02-18 49 views
0

我在阅读库中上瘾。我喜欢他们的代码结构,美观和最重要的方式:可读性。我试图通过这样做来学习。但是,有时这样的线:声明: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 

补助金的好奇是在包含它们lambda那些4个最后行。问题是:这是如何工作的?他们的意思是什么,结果如何?你能以简单的方式展示这个陈述的例子吗? 谢谢你!

+0

'_socket.py'?我无法在python2.7和python3.3中找到它。你的意思是'socket.py'吗?我没有在该文件中看到任何“错误”的定义。 '_socket'模块在'socketmodule.c'下的C中实现。 – Bakuriu

+0

@Bakuriu,我不完全清楚,但我认为IDE可能有一些涉及到的东西。我实际使用的IDE是PyCharm。该'socket.py'从这个路径导入'_socket.py':'/home/my_user/.PyCharm20/system/python_stubs /.../_ socket.py',只是为了避免任何猜测,我运行Ubuntu 。 –

+0

是的,那是*不是真正的源代码。这只是PyCharm用于推断C扩展模块类型的一个存根。真正的源代码位于Python源代码中的'/ Modules/socket.module.c'下。 – Bakuriu

回答

0

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

2

首先,我会推荐阅读the python documentation about properties。它们通常用于创建假属性。

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

在你的情况,你只能为这个属性,这样errno是只读定义的吸气剂(无缺失者的二传手)。并在每次阅读它返回一个全新的object。这可能不是很有意义,但图书馆的其他人可能期望有一个errno变量。

+0

感谢您的建议和努力回答。我肯定会读它。谢谢! –

+0

其中,object()的潜在有用属性是它仅等于它自己;像“something.errno == SPECIAL_ERRNO_I_KNOW_ABOUT”这样的测试当然是错误的,当errno是'object'的一个全新实例时 – SingleNegationElimination

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

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