由于模块被导入两次,看似正确设置的Python全局变量被返回为None?

问题描述 投票:0回答:1

我试图在我的“上下文”模块中有一个简单的单例;是的,我知道单例很糟糕,而且我讨厌使用单例,当我们完全摆脱上下文时,这是重构意大利面条式代码的众多糟糕选择中最不丑陋的一个。

这是我的模块的第一个版本。

_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._context 有上下文,即使我认为这两个应该是同一个对象,这仍然很奇怪。

我在类顶部的原始 _context = None 上放置了一个断点,我发现该行运行了两次,一次在调用 set_context 的模块中,一次在运行 get_context 的模块中。所以大概问题是我最终得到了模块的两个副本,并且我设置上下文的副本与我加载的副本不同,但我认为模块的全部要点是它们只加载一次?如何防止多个模块加载和/或让我的单例实际上是single

python python-3.x singleton
1个回答
0
投票

实际上,当我问这个问题时,我就找到了自己的答案,这让我想诅咒 python。

我从 .context 导入 set_context,就像从 context 导入 get_context 一样。因为我使用不同的路径来引用同一个模块,所以 python 显然认为它们是不同的模块并将其导入两次。在任何地方使用绝对路径可以通过确保仅导入模块的一份副本来解决问题。

这并不妨碍我咒骂Python,因为它宣传模块是独一无二的,但同时又很容易让它们不那么独特......

© www.soinside.com 2019 - 2024. All rights reserved.