背景:第一次在SE上提问.我在Python方面还很陌生,而且在编程方面也不是很有经验.我已经四处寻找,但我没有找到这个问题的答案,我非常感谢你的帮助.
我的问题是:如何导入与函数同名的模块?
具体来说,我正在使用Python 2.7符号数学库,sympy 0.7.5.
Sympy有这样的结构:
sympy
|
+-- __init__.py
+-- simplify
|
+-- __init__.py
+-- simplify.py
| |
| +-- def simplify(...)
|
+-- fu.py
|
+-- def TR8(...)
+-- def fu(...)
Run Code Online (Sandbox Code Playgroud)
我要做的是从这个结构导入fu.py,以便我可以调用TR8函数.但是,我没有太多运气.
这有效:
from sympy.simplify.fu import *
TR8(some_expression)
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我能够访问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'
Run Code Online (Sandbox Code Playgroud)
我不确定,但在我看来,Python似乎认为我正在尝试导入名为fu的函数而不是名为fu的模块.同样,当我这样尝试时:
import sympy.simplify.fu as fu
>>AttributeError: 'function' object has no attribute 'fu'
Run Code Online (Sandbox Code Playgroud)
这里Python似乎认为我在谈论函数sympy.simplify.simplify,而不是模块sympy.simplify.
当模块包含与模块同名的函数时,有没有正确的方法让Python导入模块?
sympy/simplify/__init__.py 包含以下行:
from .fu import FU, fu
Run Code Online (Sandbox Code Playgroud)
这fu通过向fu您希望模块分配功能的位置来隐藏模块,从而阻止了大多数导入方法。
如果只需要TR8功能,则可以导入:
from sympy.simplify.fu import TR8
Run Code Online (Sandbox Code Playgroud)
如果您需要该fu模块,则条目将保留在sys.modules:
import sympy.simplify.fu
import sys
fu_module = sys.modules['sympy.simplify.fu']
Run Code Online (Sandbox Code Playgroud)
这很丑陋,但应该可以。据我所知,这是获取模块本身的最简单方法。
| 归档时间: |
|
| 查看次数: |
5481 次 |
| 最近记录: |