首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在外部范围中定义的名称隐藏有什么问题?

在外部范围中定义的名称隐藏有什么问题?
EN

Stack Overflow用户
提问于 2013-11-21 15:35:11
回答 10查看 228.4K关注 0票数 298

我刚转到PyCharm,我很高兴看到它为我提供了改进代码的所有警告和提示。除了这个我不明白的:

此检查检测外部作用域中定义的隐藏名称。

我知道从外部范围访问变量是不好的做法,但是隐藏外部范围有什么问题呢?

下面是一个例子,其中PyCharm给出了警告消息:

代码语言:javascript
运行
复制
data = [4, 5, 6]

def print_data(data): # <-- Warning: "Shadows 'data' from outer scope
    print data

print_data(data)
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-11-21 15:56:56

上面的代码片段没有什么大不了的,但是想象一个函数有更多的参数和更多的代码行。然后,您决定将data参数重命名为yadda,但忽略了它在函数体中使用的一个位置.现在data指的是全局,而你开始有奇怪的行为--如果你没有全局名称data,你会有一个更明显的NameError

还请记住,在Python中,所有东西都是一个对象(包括模块、类和函数),因此函数、模块或类没有不同的名称空间。另一个场景是在模块顶部导入函数foo,并在函数体的某个位置使用它。然后向函数中添加一个新参数,并将其命名为“厄运- foo”。

最后,内置函数和类型也存在于相同的命名空间中,并且可以以相同的方式隐藏。

如果功能短、命名良好和单元测试复盖范围良好,那么这都不是什么大问题,但是,有时候您必须维护不太完美的代码,并且警告您这些可能的问题可能会有帮助。

票数 295
EN

Stack Overflow用户

发布于 2016-10-12 21:35:19

目前投票最多并被接受的答案和这里的大多数答案都忽略了重点。

不管您的函数是多长时间,或者您如何将变量命名为描述符(希望最大限度地减少潜在名称冲突的可能性)。

函数的局部变量或其参数碰巧在全局范围内共享名称这一事实是完全不相关的。事实上,无论您多么谨慎地选择局部变量名称,您的函数都无法预见“我的酷名yadda将来是否也会被用作全局变量?”解决方案是什么?不要担心这一点!正确的思维方式是设计您的函数来使用输入,并且只使用它在签名中的参数。这样,您就不需要关心(或将要)在全局范围内是什么,然后隐藏就完全不是问题了。

换句话说,只有当函数需要使用同名局部变量和全局变量时,隐藏问题才重要。但首先你应该避免这样的设计。OP的代码实际上没有这样的设计问题。只是PyCharm不够聪明,它会发出警告以防万一。因此,为了使PyCharm高兴,同时也使我们的代码整洁,可以看到这个解决方案引用了西莱夫斯克的回答来完全删除全局变量。

代码语言:javascript
运行
复制
def print_data(data):
    print data

def main():
    data = [4, 5, 6]
    print_data(data)

main()

这是“解决”这个问题的正确方法,方法是修复/删除全局事物,而不是调整当前的本地函数。

票数 238
EN

Stack Overflow用户

发布于 2016-08-29 08:22:52

在某些情况下,一个很好的解决方法可能是将变量和代码移动到另一个函数中:

代码语言:javascript
运行
复制
def print_data(data):
    print data

def main():
    data = [4, 5, 6]
    print_data(data)

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

https://stackoverflow.com/questions/20125172

复制
相关文章

相似问题

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