标题有点难以理解,但我的问题很简单。
我有一个程序需要取sqrt()
的东西,但这是math
唯一需要的东西。导入整个模块以获取单个函数似乎有点浪费。
我可以说from math import sqrt
,但是sqrt()
会被添加到我程序的主命名空间中,我不希望这样(特别是因为我打算将程序改为可用作模块;这样的导入会导致那种情况出现问题吗?)。有没有办法只导入那个函数,同时仍然保留math.sqrt()
语法?
我在这个特定情况下使用的是Python 2.7,但是如果对Python 3有不同的答案,我也希望听到它以供将来参考。
答案 0 :(得分:6)
无论哪种方式,您都可以“导入”整个math
模块,因为它已编译并存储在sys.modules
中。因此,from math import sqrt
与import 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()
将返回什么值?