Python:导入与函数同名的模块
背景介绍:这是我第一次在这个网站上提问。我对Python还很陌生,对编程也没有太多经验。我查了很多资料,但没有找到这个问题的答案,非常希望能得到大家的帮助。
我的问题是:如何导入一个和函数同名的模块?
具体来说,我正在使用Python的符号数学库sympy 0.7.5,搭配Python 2.7。
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导入一个模块,而这个模块里面有一个和模块同名的函数呢?
2 个回答
4
你还可以给这个模块使用一个命名空间。
from simpy.simplify import fu as fu_module
这样应该没问题。
11
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']
虽然这样做看起来不太好,但应该是获取这个模块的最简单方法了。