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执行
。如果将脚本用作模块,则不会导致任何问题,并且不会降低代码的可读性。

使用from
math 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()