我遇到了'redefined-outer-name'错误
当我运行我的代码检查工具时,出现了下面的错误:
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
没有关系。所以才会有这个警告。