运行我的lint时,我收到以下错误:
Redefining name 'tmp_file' from outer scope (line 38) (redefined-outer-name)
以下是我在该行中的代码片段:
tmp_file = open('../build/' + me_filename + '.js','w')
答案 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()
这项工作是因为当您创建新函数时,您会创建新的本地范围