2013-04-04 159 views
4

我想打電話給方法f(),但不小心我只是說f。 Python3會錯誤地對一個不存在的變量進行無意義的評估,因此會跳過我預期的方法調用而沒有任何通知。有沒有辦法來覆蓋這種默認行爲並獲取錯誤消息?通過禁止將標識符作爲方法和變量雙重使用,或者禁止只包含標識符的無意義陳述?Python:有沒有方法來檢測方法調用中的missing()?

+7

'F'指功能而不調用它,而不是「不存在的變量的意義評價」線。這就是爲什麼你沒有得到'SyntaxError'。 Python不區分函數名和變量名 - 它們只是'globals()'字典中的鍵。 – Volatility 2013-04-04 09:43:46

+1

*「禁止將標識符作爲方法和變量的雙重使用」* - 在python中,method *是變量 – 2013-04-04 10:00:04

+1

@Joachim,你對發生的事情不太正確(讀取@Volatility),但我理解你爲什麼要警告這一點。如果您習慣於編寫Ruby,那麼這是一個非常簡單的錯字。 – 2013-04-04 10:17:13

回答

5

它是有效的語法,所以Python不會抱怨。你可能想考慮一些其他工具,如pylint。 pylint的會一直報道:

W: 4,0: Statement seems to have no effect 

如果你壓根兒:代替

f 

f() 

,唯一的缺點是pylint的可以投訴非常多開箱。確保創建一個容忍你的風格的配置。

3
In [1]: def f(): 
    ...:  print("This is some random function") 
    ...:  return 

In [2]: a = f 

In [3]: a() 
This is some random function 

In [4]: somedict = {"call_something": f, "call_another": a} 

In [5]: somedict["call_something"]() 
This is some random function 

In [6]: f 
Out[6]: <function __main__.f> 

使用功能,而無需調用它是完全有效的語法,並具有多種用途如我剛剛所示。這不是a meaningless evaluation of a nonexisting variable,因爲函數本質上是變量。

+0

謝謝你的解釋。仍然:一個包含函數名稱'f'的語句_is_毫無意義,這幾乎肯定是一個錯誤,我希望能夠自動檢測到它的方法。 – 2013-04-04 09:52:03

1

通常的方法來確保你的代碼做它應該寫的是unit tests。如果您有良好的測試覆蓋率,這種類型的錯誤不會因此而下滑。

在Python中傳遞函數/方法的引用是非常常見的(也是有用的),所以它不是你應該禁用的東西。

+0

Zing。但是是真的。 – Joe 2013-04-04 09:50:39

0

唉,沒有。 Python沒有任何嚴格的警告模式(比較Perl和Ruby)。此外,這些線是有效的陳述,因此對它們發出警告是不公平的。

你可以編寫自己的代碼檢查器來查找這些線條。搜索是沒有任何標點符號一個字,而且是一個Python標識符(而不是作爲break這樣的關鍵字)

相關問題