Python:导入与函数同名的模块

标签 python python-2.7

对于背景:第一次在 SE 上提问。我对 Python 还是个新手,总体上对编程不是很有经验。我四处搜索,但没有找到这个问题的答案,非常感谢您的帮助。

我的问题是:如何导入与函数同名的模块?

具体来说,我正在使用 Python 2.7 使用 Python 符号数学库 sympy 0.7.5。

Sympy 的结构如下:

sympy
 |
 +-- __init__.py
 +-- simplify
       |
       +-- __init__.py
       +-- simplify.py
       |      |       
       |      +-- def simplify(...)
       |
       +-- fu.py
            |
            +-- def TR8(...)
            +-- def fu(...)

我要做的是从此结构中导入 fu.py,以便我可以调用 TR8 函数。但是,我运气不太好。

这个有效:

from sympy.simplify.fu import *

TR8(some_expression)

到目前为止,这是我能够访问 TR8 的唯一方式,但我知道这不是推荐的方式。

以下尝试失败:

from sympy.simplify import fu

fu.TR8(some_expression)
>>AttributeError: 'function' object has no attribute 'TR8'

from sympy import fu

fu.TR8(some_expression)
>>AttributeError: 'function' object has no attribute 'TR8'

我不确定,但在我看来,Python 认为我正在尝试导入名为 fu 的函数,而不是名为 fu 的模块。同样,当我这样尝试时:

import sympy.simplify.fu as fu
>>AttributeError: 'function' object has no attribute 'fu'

这里 Python 似乎认为我在谈论函数 sympy.simplify.simplify,而不是模块 sympy.simplify。

那么,当模块包含与模块同名的函数时,是否有正确的方法要求 Python 导入模块?

最佳答案

sympy/simplify/__init__.py包含以下行:

from .fu import FU, fu

这通过将 fu 函数分配到您希望模块所在的位置来隐藏 fu 模块,阻止大多数导入它的方法。

如果你只想要 TR8 功能,你可以导入它:

from sympy.simplify.fu import TR8

如果您需要 fu 模块,则在 sys.modules 中保留一个条目:

import sympy.simplify.fu
import sys

fu_module = sys.modules['sympy.simplify.fu']

它很丑陋,但它应该可以工作。据我所知,这是访问模块本身的最简单方法。

关于Python:导入与函数同名的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22374155/

相关文章:

python - Nvidia Jetson 上的 Tensorflow Lite

python - 在不需要 update_index 的情况下排除 Haystack 搜索中的对象

python - 网络爬虫无法正常工作

python - 使用通配符键匹配迭代字典

image - 如何在 PyQT GUI 中显示图像?

python - 如何从 httprequest 处理程序停止 python 中的简单 httpserver?

python - 设置 template 和wrapper_class 参数并渲染单个表单字段而不是表单

python - 没有名为 'socks' 的模块

python - 检测冲突错误说我有 9 个参数,而我有 8 个参数

python - 排序 : How to treat special character greater than alphabetical in Python 2?