我遇到了“redefined-outer-name”错误。

48

运行我的代码检查时,我遇到以下错误:

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

这是我在那行代码的片段:

tmp_file = open('../build/' + me_filename + '.js','w')
4个回答

59

这是因为你有一个与全局名称相同的本地名称。当然,本地名称具有优先级,但它隐藏了全局名称,使其无法访问,并且会让读者感到困惑。

解决方案

更改本地名称。或者也可以更改全局名称,取决于哪个更有意义。但请注意,全局名称可能是公共模块接口的一部分。本地名称应该是本地的,因此可以安全更改。

除非......你打算让这些名称相同。那么你需要在本地范围内将名称声明为global

tmp_file = None

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

如果没有使用global声明,局部变量tmp_file与全局变量无关。因此会出现警告。


3
我使用了 global 来重新分配我的外部作用域变量。但是 linter 给出了警告:W0603: 使用 global 语句 - Shaharyar
不错的发现!我认为最简单的解决方案是在变量名的开头添加下划线,就像我的情况中 addr -> _addr。 - ati ince

29

解决方案

创建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()

解释

这段代码可以正常工作,是因为每一个新的函数实例都会创建一个新的局部作用域。


7
我认为这是一个非常有用的选项,因为仅仅因为你在不同的函数中使用相同的变量而重新命名它们并没有意义。 - nck

7

使用 with 打开文件

除了@Rodrigo正确的回答关于作用域之外,如果你的tmp_file只是一个临时文件,你可以使用with语句来打开它:

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

在这两种情况下,它清楚地定义了你的tmp_file将被用于哪里。
这是处理需要明确定界作用域的变量的推荐方式
错误描述
Pylint有一个内置的描述:
pylint --help-msg=redefined-outer-name

提供

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


3

如果你在函数外和函数内都定义了相同的变量,你会遇到这个错误。

如果你使用了单个变量,请将其定义为global variable_name并在所有地方使用全局关键字。否则请重新命名其他变量。


在def中定义的变量和df外部定义的变量是我的问题。 - Kenan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接