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

15 投票
2 回答
15941 浏览
提问于 2025-04-17 22:05

背景介绍:这是我第一次在这个网站上提问。我对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']

虽然这样做看起来不太好,但应该是获取这个模块的最简单方法了。

撰写回答