我收到错误'redefined-outer-name'

时间:2014-07-28 16:37:26

标签: python

运行我的lint时,我收到以下错误:

Redefining name 'tmp_file' from outer scope (line 38) (redefined-outer-name)

以下是我在该行中的代码片段:

tmp_file = open('../build/' + me_filename + '.js','w')

4 个答案:

答案 0 :(得分:21)

这是因为您的本地名称与全局名称相同。当然,本地名称优先,但它隐藏了全局名称,使其无法访问,并使读者感到困惑。

<强>解决方案

更改本地名称。或者也许是全球名称,无论什么更有意义。但请注意,全局名称可能是公共模块接口的一部分。本地名称应该是本地名称,因此可以安全地更改。

除非......你的意图是这些名字是相同的。然后,您需要在本地范围内将名称声明为global

tmp_file = None

def do_something():
    global tmp_file # <---- here!
    tmp_file = open(...)

如果没有global声明,则本地tmp_file将与全局声明无关。因此警告。

答案 1 :(得分:3)

with

打开

除了关于范围的@Rodrigo's correct answer之外:如果您的tmp_file只是一个临时文件,则可以使用

with open('../build/' + me_filename + '.js','w') as tmp_file:
    # do something

两种情况。它清楚地定义了tmp_file的使用位置。

处理范围需要明确限制的变量是the recommended way

错误说明

Pylint有一个内置的描述:

pylint --help-msg=redefined-outer-name

给出

  

:redefined-outer-name(W0621):从外部范围重新定义名称%r   (行%s)当变量的名称隐藏在中定义的名称时使用   外部范围。此消息属于变量检查器。

答案 2 :(得分:0)

如果您在def之外和def内部的多个位置定义了相同的变量,则会出现此错误。

如果您使用单个变量,请将其定义为global variable_name并使用全局关键字。否则请重命名其他变量。

答案 3 :(得分:0)

解决方案

创建 main() 函数来保存所有主逻辑方程。

def pow(x):
    return x ** 2

def add(x, y):
    return x + y

def main():
    x, y = 2, 4
    print(pow(x))
    print(add(x, y))

if __name__ == '__main__':
    main()

说明

这项工作是因为当您创建新函数时,您会创建新的本地范围