我今天遇到了以下错误-这是一个最小的示例。
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运行时在(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)
哪个使所有人感到困惑。只有将构造函数放在一行上之后,我们才能清楚地看到问题。因此问题是:
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样式指南建议您始终将函数调用或构造函数的开头部分与类本身保持在同一行(最好没有任何空格,例如
Foo(
)。如果这样做,您甚至不需要反斜杠,因为该语句将一直持续到结束括号中。在真实的Python代码中,强烈建议不要使用反斜线来换行。几乎总是有一种更好/更干净的方式来编写不需要反斜杠的代码。