簡體   English   中英

為什么這個 Python 語法錯誤不是錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM