2015-04-01 34 views
0

我有一個類實現了__dir__方法。但是,我不完全肯定dir API的一些細節。在Python中實現`__dir__`:是否需要返回一個列表,並且列表是否需要排序?

A:是否真的需要__dir__返回一個列表?我的實現使用set來避免兩次列出屬性,我需要在返回之前將它轉換爲列表嗎?從documentation我猜它必須是一個列表:

如果對象中有一個名爲DIR()方法,這個方法會被稱爲 並且必須返回屬性的列表。

但是,在某些時候不會返回列表中斷功能嗎?


:是否需要結果進行排序?這裏的文檔有點含糊:

結果列表按字母順序排序。

這是否意味着,從調用__dir__內置dir自動排序返回的數據通過__dir__還是意味着dir預計排序的數據?

編輯:順便說一句,我的問題包含Python 2(2.6和2.7)和3(3.3,3.4)。

回答

3

在Python 2.7下。3,答案是:

答:是的,它必須是一個列表:

>>> class F: 
...  def __dir__(self): 
...    return set(['1']) 
... 
>>> dir(F()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __dir__() must return a list, not set 

B:不,dir將對其進行排序。

>>> class G: 
...  def __dir__(self): 
...    return ['c','b','a'] 
... 
>>> dir(G()) 
['a', 'b', 'c'] 
1

在Python 3下,you can return any sequence,包括一個集合,你不需要對它進行排序。

相應的文檔在Python 2下不存在,所以我不確定你期望在那裏做什麼。

1

在Python 2中,它必須是list。否則,當您在相應的實例上運行dir()函數時,會得到TypeError

class Dirry(object): 
    def __dir__(self): 
     return set('andy pandy mandy sandy'.split()) 

d = Dirry() 
dir(d) 

產量:

 5 d = Dirry() 
----> 6 dir(d) 

TypeError: __dir__() must return a list, not set 

如果返回一個列表,它不需要進行排序。該dir()功能將整理您:

class DirryList(object): 
    def __dir__(self): 
     return 'andy pandy mandy sandy'.split() 

d = DirryList() 
dir(d) 

產量:

['andy', 'mandy', 'pandy', 'sandy'] 

即使它不是在有序的__dir__給出。