为什么这个Python语法错误不是错误?

问题描述 投票:-1回答:1

我今天遇到了以下错误-这是一个最小的示例。

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)

哪个使所有人感到困惑。只有将构造函数放在一行上之后,我们才能清楚地看到问题。

因此问题是:

    考虑到必须使用反斜线
  • 为什么该语法不是语法错误?
  • 应该将其报告为错误吗?在本练习中,我使用的是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]

  • python python-3.x syntax-error pylint
    1个回答
    4
    投票
    这只是两个语句:

    foo = Foo

    定义一个名为foo的新变量,它引用

    class Foo。之后,您可以执行[

    foo("/dev/stderr")
    这将创建Foo的新实例。 

    第二个语句是

    ( "/dev/stderr" )

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

    [通常,Python样式指南建议您始终将函数调用或构造函数的开头部分与类本身保持在同一行(最好没有任何空格,例如Foo()。如果这样做,您甚至不需要反斜杠,因为该语句将一直持续到结束括号中。在真实的Python代码中,强烈建议不要使用反斜线来换行。几乎总是有一种更好/更干净的方式来编写不需要反斜杠的代码。

    © www.soinside.com 2019 - 2024. All rights reserved.