[英]Why is this Python syntax error Not an error?
我今天遇到了以下錯誤——這是一個最小的例子。
class Foo:
def __init__( self, filename ):
# set-up LOG_FILE
def log( self, msg ):
print( msg, file=self.LOG_FILE )
#------
## A) Problem here:
#
foo = Foo
(
"/dev/stderr"
)
#------
def bar( log_line ):
foo.log( "bar: "+ log_line )
## elsewhere ...
bar("this is a test") # B) example line
您無疑意識到需要更正語句A ,即:
## C) Corrected syntax:
#
foo = Foo \
( \
"/dev/stderr" \
)
這是一個簡單的修復。 但是,當您運行第一個版本(有問題)時,輸出最容易引起誤解。 首先,Python 運行時執行 (B) 處的語句。
Traceback (most recent call last):
:
foo.log( "bar: "+ log_line )
TypeError: log() missing 1 required positional argument: 'log_line'
在沒有捕捉到原始錯誤之后,回溯會尋找問題的某種“有效語法”原因。 運行時錯誤會產生誤導,因為解釋器認為代碼沒問題。
我也用pylint
檢查過。 它還對錯誤有一個有趣的理解:
E1120: No value for argument 'self' in unbound method call (no-value-for-parameter)
這讓每個人都感到困惑。 只有在將構造函數放在一行之后,我們才清楚地看到了問題。
因此問題是:
這應該報告為錯誤嗎? 在這個練習中,我使用了 Python v3.7.5 和 pylint
pylint 2.2.2
astroid 2.1.0
Python 3.7.5 (default, Nov 20 2019, 09:21:52)
[GCC 9.2.1 20191008]
這只是兩個聲明:
foo = Foo
定義一個名為 foo 的新變量,它指的是Foo 類。 此后,您可以執行以下操作
foo("/dev/stderr")
這將創建一個新的 Foo 實例。
第二個說法是
(
"/dev/stderr"
)
這只是一個包含字符串的括號表達式; 它什么都不做(類似於將(1)
單獨寫在一行上)。
通常,Python 樣式指南建議您始終將函數調用或構造函數的開頭括號與類本身保持在同一行(最好沒有任何空格,例如Foo(
)。如果這樣做,您甚至不需要反斜杠,因為語句將一直持續到結束括號。在真正的 Python 代碼中,非常不鼓勵行繼續的反斜杠;幾乎總是有一種更好/更干凈的方法來編寫不需要反斜杠的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.