繁体   English   中英

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

[英]Python: Importing a module with the same name as a function

背景:第一次在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(...)

我要做的是从这个结构导入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']

这很难看,但应该有用。 据我所知,这是获取模块本身的最简单方法。

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

from simpy.simplify import fu as fu_module

这应该工作得很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM