首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:导入与函数同名的模块

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

Stack Overflow用户
提问于 2014-03-13 17:27:10
回答 2查看 10.8K关注 0票数 11

背景资料:第一次在SE上提问。我仍然是Python的新手,总体上对编程还不是很有经验。我已经找遍了,但还没有找到这个问题的答案,我将非常感谢你的帮助。

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

具体地说,我使用的是Python符号数学库sympy 0.7.5,使用的是Python2.7。

Sympy的结构是这样的:

代码语言:javascript
复制
sympy
 |
 +-- __init__.py
 +-- simplify
       |
       +-- __init__.py
       +-- simplify.py
       |      |       
       |      +-- def simplify(...)
       |
       +-- fu.py
            |
            +-- def TR8(...)
            +-- def fu(...)

我要做的是从这个结构中导入fu.py,这样我就可以调用TR8函数了。然而,我没有太多的运气。

这是可行的:

代码语言:javascript
复制
from sympy.simplify.fu import *

TR8(some_expression)

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

以下尝试失败:

代码语言:javascript
复制
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的模块。同样,当我这样尝试时:

代码语言:javascript
复制
import sympy.simplify.fu as fu
>>AttributeError: 'function' object has no attribute 'fu'

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

那么,当一个模块包含与该模块同名的函数时,有没有一种适当的方式让Python导入该模块呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-13 18:17:18

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

代码语言:javascript
复制
from .fu import FU, fu

这通过将fu函数分配到预期模块所在的位置来隐藏fu模块,从而阻止了导入它的大多数方式。

如果您只需要TR8函数,则可以导入该函数:

代码语言:javascript
复制
from sympy.simplify.fu import TR8

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

代码语言:javascript
复制
import sympy.simplify.fu
import sys

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

虽然很难看,但应该能行得通。据我所知,这是获取模块本身的最简单方法。

票数 7
EN

Stack Overflow用户

发布于 2017-09-04 17:39:57

您还可以使用模块的命名空间。

代码语言:javascript
复制
from simpy.simplify import fu as fu_module

这应该可以很好地工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22374155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档