我遇到了'redefined-outer-name'错误

49 投票
4 回答
91725 浏览
提问于 2025-04-18 15:04

当我运行我的代码检查工具时,出现了下面的错误:

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

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

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

4 个回答

3

如果你在多个地方定义了同一个变量,比如在函数外面和里面都定义了,就会出现这个错误。

如果你想使用同一个变量,可以在函数里用 global variable_name 来声明它,并在所有地方都使用这个 global 关键字。否则,你就需要给其他的变量起个不同的名字。

7

with 打开

除了@Rodrigo的正确回答关于作用域的内容:如果你的 tmp_file 只是一个临时文件,你可以使用

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 行) 当一个变量的名称隐藏了在外部作用域中定义的名称时使用。这个消息属于变量检查器。

30

解决方案

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

解释

之所以这样做是因为每次新建一个函数时,都会创建一个新的局部作用域。

60

这个问题出现的原因是你在本地定义的名字和全局的名字是一样的。虽然本地的名字优先使用,但它会把全局的名字给隐藏起来,让人无法访问,这样会让读代码的人感到困惑。

解决办法

你可以改一下本地的名字,或者改全局的名字,选择一个更合适的。不过要注意,全局的名字可能是公共模块接口的一部分,所以改全局名字要谨慎。本地的名字应该是局部的,因此改起来比较安全。

当然,前提是... 如果你希望这两个名字是一样的,那你就需要在本地范围内声明这个名字为 global

tmp_file = None

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

如果没有 global 的声明,本地的 tmp_file 就和全局的 tmp_file 没有关系。所以才会有这个警告。

撰写回答