2014-02-18 94 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() 

不過,它看起來並不特別有用。這意味着每次嘗試在這個錯誤類的實例上檢索任何這些屬性時,您都會得到一個新的唯一對象實例。