3

标题有点难理解,但我的问题很简单。

我有一个程序需要接受sqrt()一些东西,但这是我唯一需要的东西math。导入整个模块来获取单个函数似乎有点浪费。

我可以说from math import sqrt,但随后sqrt()会被添加到我的程序的主命名空间中,我不希望这样(特别是因为我计划将程序更改为可用作模块;在这种情况下,这样的导入会导致问题吗?)。有没有办法只导入一个函数,同时仍然保留math.sqrt()语法?

在这种特定情况下,我使用的是 Python 2.7,但如果 Python 3 有不同的答案,我也想听听以供将来参考。

4

4 回答 4

6

无论哪种方式,您都可以“导入”完整的math模块,因为它被编译并存储在sys.modules. 因此,from math import sqrtimport math. 他们做同样的事情。他们导入整个math模块,存储它sys.modules,然后唯一的区别是第一个将sqrt函数带入您的命名空间,第二个将math模块带入您的命名空间。但是这些名称只是参考,因此仅从模块中导入一件事就不会在内存方面或 CPU 方面受益。

如果你想要math.sqrt语法,那么只需使用import math. 如果您想要sqrt()语法,请使用from math import sqrt.

如果您担心模块的用户在进行星号导入时不会污染他的命名空间:from your_module import *然后在模块中定义一个__all__变量,该变量是表示对象的字符串列表,如果您的模块的用户执行开始导入,则将导入这些对象.

于 2013-08-18T14:35:45.603 回答
1

使用从math import sqrt. 您可以使用__all__语句保护从模块中导出的功能。__all__应该是您要从模块中导出的名称列表。

于 2013-08-18T14:31:08.090 回答
0

最简洁的答案是不。做吧from math import sqrt。如果您将脚本用作模块,它不会导致任何问题,并且不会降低代码的可读性。

于 2013-08-18T14:30:58.933 回答
0

不,这是不可能的,因为模块是如何工作的。有什么问题import math

考虑:

module.py

x = 1

def foo():
    return x

x = 2

def bar():
    returnx

主要(伪代码):

import main but_only foo

print foo()

Python 不知道 foo 函数,直到它到达该def foo行。您提议的是从模块中随机选择行。但是python怎么知道哪几行呢?在此示例中,将foo()返回什么值?

于 2013-08-18T14:31:30.900 回答