返回介绍

from语句潜在的陷阱

发布于 2024-01-29 22:24:16 字数 1413 浏览 0 评论 0 收藏 0

因为from语句会让变量位置更隐秘和模糊(与module.name相比,name对读者而言意义不大),有些Python用户多数时候推荐使用import而不是from。不过不确定这种建议是否有根据。from得到了广泛的应用,也没太多可怕的结果。实际上,在现实的程序中,每次想使用模块的工具时,省略输入模块的变量名,通常是很方便的。对于提供很多属性的大型模块而言更是如此。例如,标准库中的Tkinter GUI模块。

from语句有破坏命名空间的潜质,这是真的,至少从理论上讲是这样的。如果使用from导入变量,而那些变量碰巧和作用域中现有变量同名,变量就会被悄悄地覆盖掉。使用简单import语句时就不存在这种问题,因为你一定得通过模块名才能获取其内容(module.attr不会和你的作用域内的名为attr的变量相冲突)。不过,使用from时,只要你了解并预料到可能发生这种事,在实际情况下这就不是一个大问题了,尤其当你明确列出导入的变量名时(例如,from module import x,y,z)。

另一方面,和reload调用同时使用时,from语句有比较严重的问题,因为导入的变量名可能引用之前版本的对象。再者,from module import*形式的确可能破坏命名空间,让变量名难以理解,尤其是在导入一个以上的文件时。在这种情况下,没有办法看出一个变量名来自哪个模块,只能搜索外部的源代码文件。事实上,from*形式会把一个命名空间融入到另一个,所以会使得模块的命名空间的分割特性失效。我们会在本书这一部分最后的“模块陷阱”再深入探讨这些话题(参考第24章)。

此处,也许真正务实的建议就是:简单模块一般倾向于使用import,而不是from。多数的from语句是用于明确列举出想要的变量,而且限制在每个文件中只用一次from*形式。这样一来,任何无定义的变量名都可认为是存在于from*所引用的模块内。使用from语句时,的确要小心一点,但是只要有些常识,多数程序员都会发现这是一种方便的存取模块的方式。

何时使用import

当你必须使用两个不同模块内定义的相同变量名的变量时,才真的必须使用import,这种情况下不能用from。例如,如果两个文件以不同方式定义相同变量名。

而你必须在程序中使用这两个版本的变量名时,from语句就不能用了。作用域内一个变量名只能有一个赋值语句。

不过,只用一个import就可以,因为把所在模块变量名加进来,会让两个变量名都是唯一的。

这种情况很少见,在实际情况中,不太可能遇见。如果你这么做,import允许你避免名字冲突。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文