2010-08-13 92 views

回答

6

对于更长的模块名称是很常见的缩短它们,例如

import numpy as np 

然后您可以使用短名称。或者你可以导入具体的东西,你需要,如在其他anwsers:

from math import sin, sqrt 

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

你应该怎么做从来没有做的是使用from math import *的形式。它会污染名称空间,可能会导致名称冲突并使调试更加困难。最重要的是它使代码很难阅读,因为不清楚某个特定功能的来源。

交互式解释程序可能会出现异常。但是,一旦你习惯使用缩短的名字,那么可能不值得在那里与另一个大会一起去。

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 

注意,在进口*从一般的做法模块或软件包是不赞成的,因为它经常会导致代码难读。但是,可以使用它来保存交互式会话中的输入。

5
from math import sin, sqrt 
# Then you can just do 
sqrt(4) 
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方法的更改将传播到g()。当然,math模块既不会在运行时发生变化,也不会在运行时更改模块的方法,这是一种特别值得推荐的编程技术。另一方面,一个模块就像Python中的其他所有东西一样,所以它总是能够意识到引擎盖下发生了什么。

通常,from math import cos as _cos; f = lambda x: _cos(x)是你想要的,它也比第二种形式快一点。

相关问题