首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确命名变量以避免像Python中的“外部作用域阴影名称”这样的警告

如何正确命名变量以避免像Python中的“外部作用域阴影名称”这样的警告
EN

Stack Overflow用户
提问于 2018-03-04 09:51:57
回答 3查看 7.3K关注 0票数 6

我在我的python程序中使用了PyCharm,我编写了下面的代码:

代码语言:javascript
运行
复制
def get_files_name():
    root_dir = "/Volumes/NO NAME/"
    for root, ds, fs in os.walk(root_dir):
        for f in fs:
            print(os.path.join(root_dir, f))


get_files_name()
for root, ds, fs in os.walk(other_dir):
    pass

因此,我得到一个警告文本,如“阴影名称'ds‘从外部范围”。我知道作用域的影响,但我仍然希望使用相同的代码格式,比如"for root,ds,fs in .“。在范围内或外部。

我搜索了PEP8,但是,我仍然不知道如何规范地命名函数中的变量。

你能给我一些建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-04 10:01:45

一般情况下,只需忽略警告即可。这只是一个警告,不是一个错误。您使用的是恰巧匹配的全局和本地名称。

但是,无论如何,我不会在全局范围内调用os.walk()。我宁愿把它也放入一个函数中,它有你不再使用的名字的好副作用。

例如,您可以使用一个main()函数:

代码语言:javascript
运行
复制
def main():
    get_files_name()
    for root, ds, fs in os.walk(other_dir):
        pass

if __name__ == '__main__':
    main()

一般来说,您不希望像root, ds, fs这样的循环名称在模块中以全局形式出现。这些都是实现细节,不应该成为模块的公共API的一部分。如果您必须在全局范围内使用类似于for循环,请在名称上使用_单下划线前缀,并考虑在使用del的循环后删除它们。

代码语言:javascript
运行
复制
for _root, _ds, _fs in os.walk(other_dir):
    # do something with the files or directories

# clean variables for the loop that are not part of the API
del _root, _ds, _fs
票数 4
EN

Stack Overflow用户

发布于 2018-03-04 10:02:15

如果你的名字重复使用"_“来避免这样的警告,这是一种常见的做法。

代码语言:javascript
运行
复制
def get_files_name():
    root_dir = "/Volumes/NO NAME/"
    for root, _ds, fs in os.walk(root_dir):
        for f in fs:
            print(os.path.join(root_dir, f))

get_files_name()
for root, _ds, fs in os.walk(other_dir):
    pass
票数 2
EN

Stack Overflow用户

发布于 2018-03-04 10:02:10

这个警告shadows name XX from outer scope不是PEP8问题,而是Pycharm的实际警告,它告诉您以这种方式重用变量名是个坏主意。换句话说,这不是一个代码风格的问题,而是一些可能在以后的大型程序中带来问题的问题。

我的建议是,在可能的情况下避免重复使用变量名。输入以下内容:

for root_path, directory_name, file_name in os.walk(root_dir):

不会花很多时间,而且将来也会避免不良的副作用。

不过,如果出于任何原因,您绝对需要重用变量名,并且希望删除警告消息,则可以在Pycharm中禁用它(Preferences -> Editor -> Code Style -> Code ->隐藏外部作用域的名称)。但这通常是个坏主意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49094078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档