如何将子模块导入父命名空间?

时间:2017-04-28 16:50:09

标签: python import namespaces

我有一个像这样的目录结构:

foo/
    __init__.py
    printsum.py
        '''
        def printsum(x,y):
            print("sum is " + str(x+y))
        '''
bar.py
    '''
    def printsum(x,y):
        print("sum is " + str(x+y))
    '''
example.py
    '''
    #!/usr/bin/env python3
    import foo.printsum
    import bar


    foo.printsum.printsum(1,2)
    bar.printsum(3,4)
    '''

文件example.py旨在作为脚本运行,而foobar则是导入的模块。我想将foo的命名空间设为bar。那就是 - 我不想要双printsum.printsum。我不希望将foo模块的所有保存在一个大的整体文件中,例如bar.py。我希望foo.printsum()方法本身保存在文件中,但我希望printsum()存在于foo.命名空间级别。

这可以以某种方式完成吗?

1 个答案:

答案 0 :(得分:1)

导入__init__py

中的功能

富/ __ init__py:

from .printsum import printsum

(如果你使用python2,你可能需要删除点或使用完整的导入路径。相对导入路径的规则在python 3中更严格)

然后你可以直接从foo调用这个函数:

import foo
foo.printsum(...)

foo导入将运行__init__。如果您需要证明,也可以在那里添加一些打印件。这是在包模块中公开功能的完美常态方式。您也可以执行*导入,但通常不建议这样做。严格导入您想要公开的内容。

换句话说,

__init__是一个可以将东西粘贴到包中的地方,但也可以在导入时触发自动初始化。

同时查找__all__关键字。隐藏与程序包或模块用户无关的代码非常有用。