从导入同时保留模块访问权限

时间:2013-08-18 14:28:26

标签: python python-2.7 code-readability

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

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

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

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

4 个答案:

答案 0 :(得分: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__变量,该变量是表示对象的字符串列表如果模块的用户进行了开始导入,则会导入。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

简短的回答是否定的。只做from math import sqrt。如果您将脚本用作模块,它不会导致任何问题,并且它不会使代码的可读性降低。

答案 3 :(得分:0)

不,由于模块的工作方式,这是不可能的。 import math出了什么问题?

考虑:

module.py

x = 1

def foo():
    return x

x = 2

def bar():
    returnx

main(伪代码):

import main but_only foo

print foo()

Python在遇到def foo行之前不知道foo函数。你提出的是从模块中随机选择一行。但是python怎么知道哪条线?在此示例中,foo()将返回什么值?