2012-12-25 47 views
58

我對某些代碼運行pylint,並收到錯誤「太少的公共方法(0/2)」。這個消息是什麼意思?該pylint docs也沒有什麼幫助:pylint的「太少的公共方法」消息意味着什麼

時使用類有太少的公共方法,所以可以肯定的,它是值得的。

+1

你的班級是什麼樣的?除了商店數據之外,班級是否還有其他的工作? – Blender

+1

所有的課程都是存儲數據。 – monsur

+2

嗯,這是你的問題。類不是爲了存儲數據。這就是像字典和列表這樣的數據結構。 – Blender

回答

77

錯誤基本上說,類並不意味着只是存儲數據,因爲你基本上是治療類作爲字典。類應該至少有幾種方法來處理它們所持有的數據。

如果你的類看起來是這樣的:

class MyClass(object): 
    def __init__(self, foo, bar): 
     self.foo = foo 
     self.bar = bar 

考慮使用一本詞典或是namedtuple代替。雖然如果一個班級看起來是最好的選擇,那就使用它。 pylint並不總是知道什麼是最好的。

請注意namedtuple是不可變的,並且在實例化時分配的值不能在以後修改。

+31

+1爲「pylint不知道什麼是最好的」 - 使用你自己的判斷,但作爲一個規則,如果你需要的是一個「結構」,使用「dict」或「namedtuple」。當你想爲你的對象添加一些邏輯時使用一個類(例如,你想要創建時發生的事情,當它添加時需要發生一些特殊的事情,你需要對它執行一些操作,控制它的方式顯示等) –

+0

感謝您的詳細回覆!我的用例與Burhan提到的類似,我在創建時正在對數據進行一些處理。 – monsur

+5

如果您在類定義中有元(metaclass),則此錯誤沒有意義。 – istinspring

23

如果要擴展一個類,那麼我的建議是系統地禁用此警告,繼續前進,例如,在芹菜任務的情況:

class MyTask(celery.Task): # pylint: disable=too-few-public-methods                     
    """base for My Celery tasks with common behaviors; extends celery.Task 

    ...    

即使你只延伸的單一功能,你絕對需要一個類來使這個技巧發揮作用,並且擴展肯定比黑客入侵第三方類更好!

+0

有了這個diable,pre-commit現在給了我:錯誤的選項值'too-few-public-method'(錯誤的選項值) – Mercury

+0

您在方法中包含's'嗎?你的壞選擇價值消息沒有它。 – sage

+0

也許更好的方法是在配置文件的'[BASIC]'部分設置'min-public-methods = 0'。這可以讓你把它放在你所有'disable ='東西(在[MESSAGE CONTROL]')中的一個單獨的行中,我發現它更容易添加關於爲什麼啓用和禁用配置以及配置更改的詳細註釋。 –