在python中导入模块和方法名称

use*_*882 1 python numpy sympy

假设我导入以下两个模块如下:

from sympy import *
from numpy import *
Run Code Online (Sandbox Code Playgroud)

两个模块都exp()定义了一个功能.python如何选择使用哪一个?有没有办法在上面导入模块后区分这些功能?在这种情况下,有什么机制可以警告用户?考虑以下一组命令IDLE

=============================== RESTART: Shell ===============================
>>> from sympy import *
>>> from numpy import *
>>> exp(5)
148.4131591025766
>>> c = symbols('c')
>>> exp(c)
Traceback (most recent call last):
  File "<pyshell#162>", line 1, in <module>
    exp(c)
AttributeError: 'Symbol' object has no attribute 'exp'
>>> 
=============================== RESTART: Shell ===============================
>>> from sympy import *
>>> c = symbols('c')
>>> exp(c)
exp(c)
Run Code Online (Sandbox Code Playgroud)

看来默认情况下 python使用了exp()定义,numpy但是当它被一个被sympy它识别的对象类型调用时会引发一个错误,导致该sympy.exp()函数无法使用.

对于这种情况,我知道两个包中都存在这些功能,但如果不这样做呢?应该有一些机制警告用户避免真正令人困惑的情况.... python社区如何处理这个问题?

Dan*_*man 7

它没有"挑选".当你这样做时,from sympy import *将所有名称从sympy导入当前命名空间; 当你这样做时也会做from numpy import *同样的事情.之前定义的任何内容都将被覆盖.这与你做的完全一样:

foo = 'bar'
foo = 'baz'
Run Code Online (Sandbox Code Playgroud)

显然,foo即使您最初将其定义为"bar" ,现在也具有"baz"的值.

解决方案不是这样做 ; 你应该明确地导入你需要的东西:

from sympy import exp, ....
from numpy import ....
Run Code Online (Sandbox Code Playgroud)

  • 所以只需要`进口同情; import numpy`; 然后你可以做`sympy.exp(foo)`和`numpy.exp(foo)`.或者,来自sympy import ext作为sympy_ext`等. (3认同)