从外部范围阴影名称 xyz

Shadows name xyz from outer scope

我正在使用 pycharm,它列出了与代码关联的所有 errors/warnings。虽然我理解其中的大部分,但我不确定这个 "Shadows name xyz from outer scope"。有一些关于此的 SO 帖子:How bad is shadowing names defined in outer scopes? 但他们似乎正在访问全局变量。

在我的例子中,我的 __main__ 函数有几个变量名,然后它调用另一个函数 sample_func 再次使用这些变量名(主要是循环变量名)。我假设因为我在不同的函数中,所以这些变量的范围将是本地的,但是警告似乎另有说明。

有什么想法吗?这里有一些代码供您参考:

def sample_func():
    for x in range(1, 5):  --> shadows name x from outer scope
        print x

if __name__ == "__main__":
    for x in range(1, 5):
        sample_func()

这只是一个 警告 ,如链接问题中所述,有时它会导致问题,但在你的情况下 x 是你的函数的本地问题。您收到警告是因为 if __name__ == "__main__": 中的 x 在全局变量中。它不会对您函数中的 x 产生任何影响,因此我不会担心警告。

当您在 sample_func 中时,main 函数的 if 分支中的代码实际上在范围内。您可以从变量 x 中读取(试试看)。这没关系,因为您并不真正关心它,所以您有几个选择可以继续前进。

1) 在 pycharm 中禁用阴影警告。老实说,这是最直接的,并且取决于您对编码员的经验,它可能最有意义(如果您相对较新,我不会这样做。)

2) 将您的主代码放入主函数中。这可能是任何生产级代码的最佳解决方案。 Python 非常擅长按照你想要的方式做事,所以你应该小心不要落入陷阱。如果您正在构建一个模块,那么在模块级别拥有大量逻辑会使您陷入困境。相反,类似以下内容可能会有所帮助:

def main():
    # Note, as of python 2.7 the interpreter became smart enough
    # to realize that x is defined in a loop, so printing x on this
    # line (prior to the for loop executing) will throw an exception!
    # However, if you print x by itself without the for loop it will
    # expose that it's still in scope. See https://gist.github.com/nedrocks/fe42a4c3b5d05f1cb61e18c4dabe1e7a
    for x in range(1, 5):
        sample_func()

if __name__ == '__main__':
    main()

3) 不要使用您在更广泛范围内使用的相同变量名。这很难执行,并且与#1 有点相反。

该警告是关于您在内部范围内重复使用这些名称所带来的潜在危险。它可能会导致您错过错误。例如,考虑这个

def sample_func(*args):
    smaple = sum(args) # note the misspelling of `sample here`
    print(sample * sample)

if __name__ == "__main__":
    for sample in range(1, 5):
        sample_func()

因为您使用了相同的名称,所以您在函数内的拼写错误不会导致错误。

当你的代码非常简单时,你会逃脱这种事情而不会产生任何后果。但是最好使用这些 "best practices" 以避免在更复杂的代码上出错。

我知道这是一个旧线程,这不适合提问者试图找出的问题,但我正在寻找 PyCharm 为什么向我展示 'Shadows name from outer scope' 复杂 if/elif 语句块上的消息...

事实证明,我在函数的开头将一些全局变量名称大写,但在我的 if/elif 块中使用了小写字母,在函数的更下方。

我知道男生错误,但是一旦我更正了这个错误,PyCharm 中的 'Shadows name from outer scope' 消息就消失了,变量不再显示为灰色...

所以我得到的教训是,这个 PyCharm 消息可能是由变量名中的 upper/lower 大小写错误这样简单的事情引起的...

我只是在将函数分解为三个函数以查看这是否会消除 'Shadows...' 错误时才意识到这个问题,因为我认为我遇到了缩进问题,这导致了问题!

这可能会帮助另一个摸不着头脑想知道为什么会出现此错误的新手:-)

我 运行 收到此关于名为 year 的方法中的参数的警告,但没有其他变量共享该名称。然后我意识到这是因为 from pyspark.sql.functions import * 行导入了一个 year 变量。将其更改为仅导入我们需要的功能以消除警告。