在python中导入模块时如何避免一直写出模块的名称?

时间:2010-08-13 11:51:58

标签: python module import

我最近使用了math模块。我不想一直写math.sqrt(x)math.sin(x)。我想缩短它并写下sqrt(x)sin(x)。 怎么样?

4 个答案:

答案 0 :(得分:6)

对于较长的模块名称,通常会缩短它们,例如

import numpy as np

然后你可以使用短名称。或者你可以导入你需要的特定东西,如其他的anwsers所示:

from math import sin, sqrt

这通常用在包内,用于更紧密耦合的代码。对于图书馆而言,名称缩短的第一个选项通常是首选方式。

从不所做的是使用from math import *表单。它会污染名称空间,可能导致名称冲突并使调试更加困难。最重要的是,它使代码难以阅读,因为不清楚特定功能的来源。

可以在交互式解释器中进行异常。但是一旦你养成使用缩写名称的习惯,就可能不值得去那里使用其他约定。

答案 1 :(得分:5)

您可以像这样导入:

>>> from math import sqrt, sin
>>> sqrt(100)
10.0

来自:More on modules

  

import语句的一个变体是将模块中的名称直接导入导入模块的符号表。例如:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
     

甚至还有一个变体来导入模块定义的所有名称,这些名称在交互式解释器中非常有用:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
     

请注意,一般来说,从模块或包导入*的做法是不受欢迎的,因为它经常会导致代码难以理解。但是,可以使用它来保存交互式会话中的输入。

答案 2 :(得分:5)

from math import sin, sqrt
# Then you can just do
sqrt(4)

答案 3 :(得分:1)

让我补充一点,我不仅考虑from math import *名称空间污染,还考虑from math import cos。这是因为当您在模块foo之上执行此操作时,然后使用import foo; print( dir( foo ) )查看该模块的命名空间,您将在该列表中有一个项cos。通常,这不是你想要的。

因此大部分时间我的所有导入都看起来像from math import cos as _cos,前导下划线是表示私人名称的传统印记。我们的想法是从另一个模块和打印输出import foo; print( name for name in dir( foo ) if not name.startswith( '_' ) )导入,将准确地将那个在该模块中定义的名称公之于众。

有一点需要注意:from math import cos as _cos; f = lambda x: _cos( x )在功能上与import math; g = lambda x: math.cos( x )不完全相同。不同的是,在python中,每次调用代码时,名称解析都会在运行时发生。在第一次导入时,名称cos仅解析一次;对math模块的任何后续更改都不会影响f()。对于第二次导入,cos每次调用时都会针对math解析,因此对数学模块的cos方法的更改将传播到{{1} }}。当然,g()模块既不会在运行时期间发生变化,也不会在运行时更改模块的方法,这是一种特别值得推荐的编程技术。另一方面,一个模块就像python中的其他所有对象一样,所以总是要知道底层发生了什么是值得的。

通常,math是您想要的,它也比第二种形式快一点。