Python 在保留模块访问权限的同时从导入
标题有点难理解,但我的问题很简单 我有一个程序需要接受某个东西的Python 在保留模块访问权限的同时从导入,python,python-2.7,code-readability,Python,Python 2.7,Code Readability,标题有点难理解,但我的问题很简单 我有一个程序需要接受某个东西的sqrt(),但这是我从math中需要的唯一东西。导入整个模块以获取单个函数似乎有点浪费 我可以从math import sqrt中说,但是sqrt()将被添加到我的程序的主名称空间中,我不希望这样做(特别是因为我计划将程序更改为可用的模块;在那种情况下导入会导致问题吗?)。有没有办法只导入这一个函数,同时仍然保留math.sqrt()语法 在这种情况下,我使用的是Python2.7,但如果Python3有不同的答案,我也希望听到,
sqrt()
,但这是我从math
中需要的唯一东西。导入整个模块以获取单个函数似乎有点浪费
我可以从math import sqrt中说,但是sqrt()
将被添加到我的程序的主名称空间中,我不希望这样做(特别是因为我计划将程序更改为可用的模块;在那种情况下导入会导致问题吗?)。有没有办法只导入这一个函数,同时仍然保留math.sqrt()
语法
在这种情况下,我使用的是Python2.7,但如果Python3有不同的答案,我也希望听到,以供将来参考。简短的答案是否定的。只需从math import sqrt执行。如果将脚本用作模块,则不会导致任何问题,并且不会降低代码的可读性。使用frommath import sqrt
。您可以使用\uuu all\uu
语句保护从模块导出的函数<代码>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。导入数学有什么问题
考虑:
module.py
x = 1
def foo():
return x
x = 2
def bar():
returnx
主(伪代码):
Python在到达def foo
行之前不知道foo函数。您的建议是从模块中随机选择行。但是python如何知道哪一行呢?在本例中,foo()
返回什么值?无论哪种方式,您都可以“导入”完整的math
模块,因为它被编译并存储在sys.modules
中。因此,与导入数学相比,如果从数学导入sqrt执行操作,则不会有任何优化好处。他们做完全相同的事情。他们导入整个math
模块,存储它sys.modules
,唯一的区别是第一个模块将sqrt
函数带到您的命名空间中,第二个模块将math
模块带到您的命名空间中。但是这些名称只是引用,所以从模块中只导入一件东西不会对内存或CPU带来好处
如果需要math.sqrt
语法,只需使用import math
。如果需要sqrt()
语法,请使用math import sqrt
中的
如果您关心的是保护模块用户在执行星型导入时不污染其命名空间:从您的_模块导入*
,则在模块中定义一个\uuuuuuuuuuuuuuuuuuuu
变量,该变量是一个字符串列表,表示在模块用户启动时将导入的对象导入。\uuuuuuuuuuuuuuuuuuuuuuu
仅影响来自。。。导入*
哪一个无论如何都不应该使用。是的,但他想让自己的程序作为模块提供给其他人。然后,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。更重要的是,如果模块按其应该使用的方式使用,即使用导入模块
或模块导入特定内容的,则您提出的解决方案没有帮助。再说一遍,我甚至不确定一开始是否有问题。事实上,如果OP的用户按照您建议的方式只导入OP的模块,那么名称空间污染就没有问题了。我的建议是针对OP的用户不按您建议的方式使用import
的情况。我理解这一点。我的一部分观点是,IMHO,这种方式(import*
)不是一个需要很好地支持的用例,因为它通常是不受欢迎的(参见以往的每个样式指南),并且有许多其他问题。啊,我不知道。有用的信息。可以肯定的是,py2exe是否以任何方式改变了这种情况?不,py2exe没有改变python导入模块的方式。
import main but_only foo
print foo()