导入以下划线开头的符号

Mic*_*ral 8 python

我正在编写一个简单的Python库,其中我有几个以下划线开头的"私有"函数:

def _a():
    pass

def _b():
    pass

def public_interface_call():
    _a()
    _b()
Run Code Online (Sandbox Code Playgroud)

这样我的库用户可以简单地做,from MyLib.Module import *并且他们的命名空间不会与实现细节混杂在一起.

然而,我也在编写单元测试,我很乐意分别测试这些函数,简单地导入我模块中的所有符号都非常方便.目前我在做,from Mylib.Module import _a _b public_interface_call但我想知道是否有更好/更快/更清洁的方式来实现我想要的?

Mic*_*ral 8

当我写这个问题时,我不确定它是否是停电或者其他什么但今天我意识到(受Underyx的评论启发)我可以简单地这样做:

import MyLib.Module

MyLib.Module._a()
MyLib.Module._b()
Run Code Online (Sandbox Code Playgroud)

或者甚至缩短一点(因为我是一个懒惰的混蛋):

import MyLib.Module as mm

mm._a()
mm._b()
Run Code Online (Sandbox Code Playgroud)

  • 我认为有一个好处是我没有必须额外维护的长进口链。假设我添加函数`_c`。然后我必须导入它,然后我才能调用它,通过我的解决方案我可以立即使用它。 (2认同)

Jet*_*lue 5

根据文档

甚至还有一个变体可以导入模块定义的所有名称:
from fibo import *
...
这会导入除以下划线 (_) 开头的名称之外的所有名称。

但不确定为什么会出现这种情况。

  • 出现这种情况是因为带有前导下划线的模块被认为是私有的,例如不应在包外部使用。如果你真的想要,你可以。但在其他语言中,这些函数将是严格私有的,这意味着您甚至无法从外部访问它们。import * 不导入它们是件好事。 (3认同)