为什么这个 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需要更正,viz.:

##  C) Corrected syntax:   
#
foo = Foo            \  
(                    \
    "/dev/stderr"    \   
)      

这是一个简单的修复。但是,当您 运行 第一个版本(有问题)时,输出最具误导性。首先,Python 运行time 执行 (B) 处的语句。

Traceback (most recent call last):
   :
   foo.log( "bar:  "+ log_line )
TypeError: log() missing 1 required positional argument: 'log_line'

在未发现原始错误后,回溯会寻找问题的某种 "valid syntax" 原因。 运行time 错误会产生误导,因为解释器认为代码是正确的。

我也检查过 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的新变量,它引用了class Foo。此后你可以做类似

的事情
foo("/dev/stderr")

这将创建一个新的 Foo 实例。

第二种说法是

(
    "/dev/stderr"
)

这只是一个包含字符串的括号表达式;它什么都不做(类似于只在一行上单独写 (1) )。

通常,Python 风格指南建议您始终将函数调用或构造函数的左括号与 class 本身保持在同一行(最好没有任何 space ,例如 Foo()。如果你这样做,你甚至不需要反斜杠,因为语句会一直持续到右括号。在实际 Python 代码中,强烈建议不要使用反斜杠来续行;几乎总是有一种 better/cleaner 的方式来编写不需要反斜杠的代码。