运行我的代码检查时,我遇到以下错误:
Redefining name 'tmp_file' from outer scope (line 38) (redefined-outer-name)
这是我在那行代码的片段:
tmp_file = open('../build/' + me_filename + '.js','w')
运行我的代码检查时,我遇到以下错误:
Redefining name 'tmp_file' from outer scope (line 38) (redefined-outer-name)
这是我在那行代码的片段:
tmp_file = open('../build/' + me_filename + '.js','w')
这是因为你有一个与全局名称相同的本地名称。当然,本地名称具有优先级,但它隐藏了全局名称,使其无法访问,并且会让读者感到困惑。
解决方案
更改本地名称。或者也可以更改全局名称,取决于哪个更有意义。但请注意,全局名称可能是公共模块接口的一部分。本地名称应该是本地的,因此可以安全更改。
除非......你打算让这些名称相同。那么你需要在本地范围内将名称声明为global
:
tmp_file = None
def do_something():
global tmp_file # <---- here!
tmp_file = open(...)
如果没有使用global
声明,局部变量tmp_file
与全局变量无关。因此会出现警告。
创建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()
这段代码可以正常工作,是因为每一个新的函数实例都会创建一个新的局部作用域。
with
打开文件除了@Rodrigo正确的回答关于作用域之外,如果你的tmp_file
只是一个临时文件,你可以使用with
语句来打开它:
with open('../build/' + me_filename + '.js','w') as tmp_file:
# do something
tmp_file
将被用于哪里。pylint --help-msg=redefined-outer-name
提供
:redefined-outer-name(W0621):从外部作用域重新定义名称%r(第%s行) 当变量的名称隐藏在外部作用域中定义的名称时使用。此消息属于变量检查器。
如果你在函数外和函数内都定义了相同的变量,你会遇到这个错误。
如果你使用了单个变量,请将其定义为global variable_name
并在所有地方使用全局关键字。否则请重新命名其他变量。
global
来重新分配我的外部作用域变量。但是linter
给出了警告:W0603: 使用 global 语句。 - Shaharyar