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社区如何处理这个问题?
它没有"挑选".当你这样做时,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)