如何在 python(可导入)脚本中仅公开少数 'names'(variables/functions)

How to expose only few 'names' (variables/functions) in a python (importable) script

我有以下 Python 脚本:

#! /usr/bin/python3 -u
# encoding: utf-8

import zmq
import logging
import os

_zmq_channel = "ipc:///tmp/hms_logger.ipc"


class _Logger:
    _instance = None
    _instance_pid = 0

    def __init__(self):
        ctx = zmq.Context.instance()
        self._logger = ctx.socket(zmq.PUB)
        self._logger.connect(zmq_channel)

    @classmethod
    def instance(cls):
        if cls._instance is None or cls._instance_pid != os.getpid():
            cls._instance = cls()
            cls._instance_pid = os.getpid()
        # print(cls._instance)
        return cls._instance

    def _write(self, obj):
        self._logger.send_pyobj(obj)

    def debug(self, msg: str):
        self._write((logging.DEBUG, msg))

    def info(self, msg: str):
        self._write((logging.INFO, msg))

    def warn(self, msg: str):
        self.warning(msg)

    def warning(self, msg: str):
        self._write((logging.WARNING, msg))

    def error(self, msg: str):
        self._write((logging.ERROR, msg))

    def critical(self, msg: str):
        self._write((logging.CRITICAL, msg))


def get_logger():
    return _Logger.instance()

如果我导入上面的脚本,我怎样才能确保只导入 get_logger() 而其他名称如 _Logger_zmq_channel 不导入,即导入它们应该会产生一些错误或警告

我找到了答案。

基本上,默认情况下,如果我在其他文件中导入此模块,使用:

import thismodule 要么 from thismodule import *

只会导入不以 _(下划线)开头的名称。

但是,如果有人故意导入 _ 个名字,它们将被导入:

from thismodule import _Logger

因此,在 python 模块中部分隐藏 variables/names 的一种方法是以 _

开头命名它们

另一种方法,我发现是在模块中定义一个特殊变量:__all__

定义一个变量 __all__,其值为要导入的 list 个名称。 名称必须与变量名完全相同,并且必须用 ''""

括起来

例如:__all__ = [ 'get_logger' ]

这可以在您的模块中的任何地方定义,但是,最好的地方是在顶部定义它,在导入之后,以便导出的名称很容易访问。