Python模块的别名

4 投票
3 回答
1622 浏览
提问于 2025-04-17 09:40

我有一个Python模块,我是这样导入的:

from mygraph.draw import pixel

这个文件结构看起来是这样的:

mygraph/
    __init__.py
    draw.py

而且 draw.py 文件里包含了 def pixel() 这个函数。

现在,我想添加另一个函数 line(),并且我想这样导入它:

from mygraph.draw import line

我可以简单地把 line 加到 draw.py 里。但是,我希望把 line() 放在一个单独的文件 line.py 中,这样就不需要去修改 draw.py。可是,如果我把它放在一个单独的文件里,它会被导入成:

from mygraph.line import line

这不是我想要的...

有没有办法可以“别名”一下 line.py,让它在 draw 模块中可见,但又放在一个单独的文件里?我考虑过在 draw 里添加一个虚拟函数:

def line():
    return real_line.line()

但这样的话,我就得不到原始 line 的“文档字符串”,而且在调用真正的 line 函数时会损失一些性能。

3 个回答

3

一个简单的方法是把以下几行代码添加到 draw.py 文件中:

from line import line

在这种情况下,你也可以从 draw.py 中导入 line

4

这样的结构会让你更容易理解:

mygraph/
    __init__.py
    draw/
        __init__.py
        pixel.py
        line.py

然后在 draw/__init__.py 文件中,你会写这样的代码:

from mygraph.draw.pixel import pixel, redpixel, greenpixel
from mygraph.draw.line import line, redline, greenline

这样使用你的包就很方便:

from mygraph.draw import redpixel, redline

要注意循环导入的问题。 比如说,如果 line 需要 pixel 来工作,而你在 line.py 中写了 import pixel,那么你就不能在 pixel.py 中写 import line,因为这样会导致循环导入的问题。

5

在你的 draw.py 模块里试试这个:

from line import line

这样你就可以用 mygraph.draw.line 来调用它了,而且可以按照你想要的方式导入。

我在我的 __init__.py 文件里经常这样做:以这种方式展示主要的接口。

撰写回答