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

use*_*783 10 python module

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

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

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

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

    def _generate_foo():
        bar = ...
        for i in ...:
            bar.append(...)
        return [bar, ...]
    
    foo = _generate_foo()
    
    Run Code Online (Sandbox Code Playgroud)

这些方法中哪一个被认为更好?或者,是否有另一种方法来构建这个模块,这是首选的?

Bre*_*arn 19

请注意,使用下划线仅可防止导入该名称from module import *(如文档所述).它不会以任何真实的方式使名称"私密".通过这样做import module,人们仍然可以看到模块中的所有内容module._hiddenStuff.

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

__all__ = ['foo'] # foo being the one thing you do want to export
Run Code Online (Sandbox Code Playgroud)

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


bea*_*ito 0

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

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

然而,PEP-8支持使用下划线,因此任何 _symbols 都不会被导入import *