如何构建Python模块以限制导出的符号?

时间:2014-11-08 03:54:57

标签: python module

我正在编写一个Python模块,其目的是导出单个数据结构。我相信这意味着我的模块应该导出单个符号(例如foo),其所有其他符号都以下划线为前缀。

生成数据结构需要相当多的代码 - 我应该如何构建模块以确保在没有前缀的情况下导出此代码中的符号?两种可能的方法是:

  1. 将生成代码放在顶层,小心使用下划线,例如:

    _bar = ...
    for _i in ...:
        _bar.append(...)
    
    foo = [_bar, ...]
    
  2. 将生成代码放在返回数据结构的函数中。这只需要函数名称来使用下划线。例如:

    def _generate_foo():
        bar = ...
        for i in ...:
            bar.append(...)
        return [bar, ...]
    
    foo = _generate_foo()
    
  3. 这些方法中的任何一种都被认为更好吗?或者,是否有另一种方法来构建这个模块,这是首选的?

2 个答案:

答案 0 :(得分:17)

请注意,使用下划线只会阻止使用from module import *documented)导入该名称。它没有名称"私人"以任何真实的方式。通过import module然后module._hiddenStuff,人们仍然可以看到模块中的所有内容。

对于您的情况,您应该使用__all__。让代码成为您想要的任何代码,但在模块的顶部执行:

__all__ = ['foo'] # foo being the one thing you do want to export

这与使用下划线具有相同的效果,但是当您想要排除大部分内容而不是包含它们时会更好。

答案 1 :(得分:0)

从纯粹的可维护性角度来看,我更喜欢功能定义方法。

同样重要的是要记住,我们都同意成年人,用户有责任以最适合他们使用的方式使用您的模块。

PEP-8支持使用下划线,因此import *

不会导入任何_符号