如何在 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' ]
这可以在您的模块中的任何地方定义,但是,最好的地方是在顶部定义它,在导入之后,以便导出的名称很容易访问。
我有以下 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' ]
这可以在您的模块中的任何地方定义,但是,最好的地方是在顶部定义它,在导入之后,以便导出的名称很容易访问。