如何正确命名变量以避免在Python中出现类似“外部作用域的阴影名称”的警告

问题描述 投票:3回答:3

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

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,但是,我仍然不知道如何在函数中命名变量。

你能给我一些建议吗?

python scope coding-style convention
3个回答
2
投票

一般来说:只是忽略警告。这只是一个警告,而不是错误。您可以使用碰巧匹配的全局和本地名称。

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

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

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循环后删除它们:

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

1
投票

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

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

0
投票

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

我的建议是,尽可能避免重用变量名。打字这个:

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

不需要花费很多时间,并且可以避免将来出现不良副作用。

但是,如果由于任何原因你绝对需要重用变量名并想要删除警告消息,你可以在Pycharm中禁用它(首选项 - >编辑器 - >代码样式 - >检查 - >外部作用域的阴影名称)。但这通常是一个坏主意。

© www.soinside.com 2019 - 2024. All rights reserved.