我试图在我的“上下文”模块中有一个简单的单例;是的,我知道单例很糟糕,而且我讨厌使用单例,当我们完全摆脱上下文时,这是重构意大利面条式代码的众多糟糕选择中最不丑陋的一个。
这是我的模块的第一个版本。
_context = None
def set_context(context):
global _context
#assorted error checking you don't care about done here
_context = context
return context
def get_context():
if not _context:
raise ValueError("Attempt to call context before it was initialized")
return _context
在我的调试器中,我可以调用 set context 并按照我的预期设置 _context 。但是,当调用 get_context 时,_context 为 None。如果我在 set_context 中设置断点,并且在调试器中我尝试检查变量,它说 _context 是 None 但
我在类顶部的原始 _context = None 上放置了一个断点,我发现该行运行了两次,一次在调用 set_context 的模块中,一次在运行 get_context 的模块中。所以大概问题是我最终得到了模块的两个副本,并且我设置上下文的副本与我加载的副本不同,但我认为模块的全部要点是它们只加载一次?如何防止多个模块加载和/或让我的单例实际上是single?
实际上,当我问这个问题时,我就找到了自己的答案,这让我想诅咒 python。
我从
这并不妨碍我咒骂Python,因为它宣传模块是独一无二的,但同时又很容易让它们不那么独特......