2014-02-17 66 views
48

我仍然習慣於Python的約定,並使用pylint來使我的代碼更pythonic,但我很困惑的事實,即pylint不喜歡單個字符變量名稱。我有幾個循環是這樣的:爲什麼pylint對象是單個字符變量名?

for x in x_values: 
    my_list.append(x) 

,當我跑pylint,我越來越Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30} - 這表明,一個有效的變量名必須是字符3和31之間長,但我已經通過看PEP8 naming conventions和我沒有看到有關單個小寫字母的任何明確內容,而且我看到很多使用它們的示例。

PEP8中是否存在缺少的東西?或者這是對pylint獨特的標準嗎?

回答

37

PyLint不僅檢查PEP8推薦。它也有自己的建議,其中一個是變量名應該是描述性的,不能太短。

你可以利用這一點避免這種簡稱:

my_list.extend(x_values) 

或者使用_作爲臨時變量的佔位符(其中正則表達式將PASS)

9

更深層次的原因是,你可能還記得您打算使用a,b,c,,x,yz表示當您編寫代碼時,但是當其他人閱讀代碼時,或者甚至當您返回代碼時,代碼在您給出代碼時變得更具可讀性語義名稱。我們不是在黑板上寫東西,然後擦掉它。我們正在編寫可能會持續十年或更長時間的代碼,並且可以多次閱讀。

使用語義名稱。我用過的語義名稱一直是ratio,denominator,obj_generator, path等等。它可能需要一秒或兩秒的時間才能輸出,但是當你節省時間試圖弄清楚你寫了甚麼半小時非常值得。

+6

謝謝。這裏是最終的代碼 - https://gist.github.com/amandabee/8969833 - 我看到你對於我(或者你)一年可以閱讀的代碼的看法,但是在這種情況下,我認爲x和y是真正具有描述性。 – Amanda

12

在強類型語言中,1個字母名稱變量可以是確定十歲上下,因爲你通常得到的變量的聲明或函數/方法的原型名稱旁邊的類型:

bool check_modality(string a, Mode b, OptionList c) { 
    ModalityChecker v = build_checker(a, b); 
    return v.check_option(c); 
} 

在Python中,你沒有得到這個信息,所以,如果你寫:

def check_modality(a, b, c): 
    v = build_checker(a, b) 
    return v.check_option(c) 

你離開絕對沒有線索的維修隊伍,以什麼功能可以做,以及它是如何調用,它返回什麼。所以在Python中,您傾向於使用描述性的名稱:

def check_modality(name, mode, option_list): 
    checker = build_checker(name, mode) 
    return checker.check_option(option_list) 

,你甚至還可以添加文檔字符串解釋什麼東西呢,預計什麼類型的。

+6

而不是「編譯語言」,我會寫「明確鍵入」。例如,Haskell也被編譯,但是你可以用Python編寫隱式聲明。 –

+6

儘管在這些情況下我同意你的意見,但強制變量名中的3個或更多字符並不意味着它是描述性的。例如,我正在使用'with open(FILE)作爲f:items = f.readlines()',其中變量'f'非常明顯,但是我得到了pylint警告。這讓我變成了flake8。 –

+1

您還可以更改pylint規則以允許'f'變量名稱。 i,j AFAIR已經有例外。 –

45

關於gurney alex指出的更多細節:你可以告訴PyLint爲variable names作出例外,即使少於三個字符,你(小指發誓)也是完全清晰的。找到或添加到您的pylint。RC文件:

# Good variable names which should always be accepted, separated by a comma 
good-names=i,j,k,ex,Run,_,pk,x,y 

這裏PK(主鍵),x和y是變量名我已經添加。

+3

這是最好的答案。 – giorgiosironi

1

現在,還有一個選項可以覆蓋正則表達式。即如果你想允許單個字符變量:

pylint --variable-rgx=[a-z0-9_]{1,30} <filename> 

所以,pylint將匹配PEP8和頂部不會帶來額外的違規行爲。

相關問題