【问题标题】:On import modules and method names in python关于python中的导入模块和方法名
【发布时间】:2017-08-04 17:31:06
【问题描述】:

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

from sympy import *
from numpy import *

两个模块都定义了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)

似乎默认情况下 python 使用numpy 中的exp() 定义,但是当它被sympy 识别的对象类型调用时,它会引发一个错误,从而呈现sympy.exp()功能无法使用。

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

【问题讨论】:

  • 你需要使用import as
  • 关于您看到的错误:NumPy 的exp 在所有情况下都被使用。错误来自函数期望一个数组或类似数组的对象作为参数的事实。在某些时候,NumPy 的exp 在传递的参数上调用exp 方法,这会导致错误,因为SymPy 的Symbols,如所示,没有这样的方法。

标签: python numpy sympy


【解决方案1】:

它不会“选择”。当您执行from sympy import * 时,它将所有名称从 sympy 导入到当前命名空间中;当您执行from numpy import * 时,它会执行相同的操作。之前定义的任何内容都会被覆盖。这与您所做的完全相同:

foo = 'bar'
foo = 'baz'

显然,foo 现在具有值“baz”,尽管您最初将其定义为“bar”。

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

from sympy import exp, ....
from numpy import ....

【讨论】:

  • 但是如果我想使用 both 库中的exp 命令怎么办?在这种情况下,它仍然会被覆盖,即from sympy import exp; from numpy import exp
  • 所以import sympy; import numpy;然后你可以做sympy.exp(foo)numpy.exp(foo)。或者,from sympy import ext as sympy_ext 等。
  • 你应该读一下the effbot's classic guide to importing;它很旧,但仍然完全有效。
  • @user32882 如果您想要一个 exp 函数,它对 NumPy 和 SymPy 的工作方式相同(例如,编写一个适用于两种对象的数学函数),那么只有没有自动的方法来做到这一点。您需要编写自己的 exp 函数,动态检测参数是 SymPy 还是 NumPy(或 NumPy array-like)对象并调用正确的函数。但是,完全正确地进行类型检测可能会很棘手且难以维护。
  • 但是你不需要知道你是否按照我链接的那篇文章中的建议遵循了良好的做法,并导入模块而不是*。无论如何,如果你不知道你在导入什么,你怎么知道你可以调用什么?当然,明确地导入你需要的东西是有意义的。
【解决方案2】:

据我所知,根据您的代码,numpy 的 exp() 将被添加到您的命名空间,因为它是最后一个导入的模块。 所以,在这种情况下,最后一个赢得比赛! 要解决这个问题,只需使用:

from toys import yo-yo as yo-yo1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2020-07-10
    相关资源
    最近更新 更多