我正在处理一组具有大量共享后端功能的 Python 项目。为避免代码重复,我已将此共享功能放入模块中。
其中一个模块是事件系统。我希望事件系统在单个项目中是全局的,因此我定义了一个包含类级变量和方法的 EventDispatcher 类:
event_name = str
event_data = Any
listener_callback = Callable[[event_name, event_data], None]
class EventDispatcher:
# event name, List<event_callback>
_listeners: Dict[event_name, Set[listener_callback]] = {}
@classmethod
def register_listener(cls, event: event_name, listener: listener_callback) -> None:
# get the existing list of listeners for this event and append the new listener to it
listener_callbacks: Set[listener_callback] = cls._listeners.get(event, set())
listener_callbacks.add(listener)
# put the listener list back in the map
cls._listeners[event] = listener_callbacks
#other listener methods follow
因为一切都是类级别的,所以我应该能够在我项目的任何类中调用 EventDispatcher.register_listener,并且所有已注册的监听器都应该添加到同一个列表中。
我关心的是其他项目。由于共享功能的数量,我在同一个虚拟环境中运行所有项目。这会导致 EventDispatcher 和 co.在虚拟环境中的所有代码之间共享,这样在一个项目中注册的事件可以从另一个项目中触发,或者每个项目都会得到自己的副本?
作为后续问题,如果共享虚拟环境确实导致EventDispatcher 的类变量在虚拟环境中的每个项目之间共享,将为每个项目提供一个单独的虚拟环境产生我真正想要的行为?
请您参考如下方法:
没有。只要您的程序在不同的文件中并且您没有导入包含 EventDispatcher 类的文件,它就不会以任何方式共享。
虚拟环境只会共享 python 版本和已安装的包。
