如何在模块中从__all__定义一个`from ... import*'api?

Eth*_*man 5 python api python-3.x

我有一个模块,它在实用程序类型函数和核心api函数之间大致分成两半.我需要将它们全部__all__放入以便help()有用,并且还要指定模块中的许多函数/类/等中的哪一个用于外部使用,但我也想支持from mymodule import *作为获取核心的方法功能到其他模块.有没有办法做到这一点?

Eth*_*man 5

几乎。虽然您不能__all__以这种方式执行双重任务,但您可以添加自己的虚拟 api 模块,然后可以将其导入...

class fake_module(object):
    def __init__(self, name, *args):
        self.name = name
        self.__all__ = []
        all_objects = globals()
        for name in args:
            self.__dict__[name] = all_objects[name]
            self.__all__.append(name)
    def register(self):
        sys.modules["%s.%s" % (__name__, self.name)] = self

    fake_module('api', 'class1', 'class2', 'func3', 'exception4').register()
Run Code Online (Sandbox Code Playgroud)

然后在其他模块中,而不是from mymodule import *您可以from mymodule.api import *只获得所需的子集,同时仍将所有内容保留在单个模块中。

注意:from ... import *通常不是好的做法,应该非常小心地使用,并且只能与明确声明它们是在设计时考虑到这种用法的模块/包一起使用。