为什么这个 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 的方式来编写不需要反斜杠的代码。
我今天遇到了以下错误 -- 这是一个最小的例子。
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 的方式来编写不需要反斜杠的代码。