当前位置: 首页 > 面试题库 >

为什么python模块的行为像单例?

仲法
2023-03-14
问题内容

作为应用程序运行的一部分,我从远程数据库创建字典。这个过程相当I / O繁重,因此我决定创建此字典的“单例”实例,并根据需要在应用程序中对其进行调用。

代码看起来像(在中Dictionaries.py):

state_code_dict = None

def get_state_code_dict():
    global state_code_dict
    if state_code_dict == None:
        state_code_dict = generate_state_code_dict()
    return state_code_dict

然后导入并get_state_code_dict()在需要的地方调用该函数。我添加了一条打印语句,以检查是否state_code_dict正在重新初始化或重用,然后发现它已被重用(这是我想要的功能)。为什么state_code_dict幸存的应用程序实例运行?

编辑

我将get_state_code_dict功能导入多个文件。


问题答案:

这是《
Python语言参考》对模块导入方式的描述:

(1)找到一个模块,并 在必要时对其进行 初始化;(2)在本地名称空间中定义一个或多个名称

(添加了强调。)在这里, 初始化 模块意味着执行其代码。仅在 必要时
执行此执行,即,如果当前进程中先前未导入模块。由于Python模块是一流的运行时对象,因此它们实际上成为单例,并在首次导入时进行了初始化。

请注意,这意味着不需要get_state_dict_code功能。只需state_code_dict在顶层初始化即可:

state_code_dict = generate_state_code_dict()


 类似资料:
  • 问题内容: 我注意到我今天想解释的东西很奇怪。我不是100%不确定如何将其表达为一个问题,所以google是不可能的。由于某些奇怪的原因,日志记录模块无权访问模块logging.handlers。如果您不相信我,请自己尝试: 谁能解释为什么会这样? 问题答案: 在Python中,需要先导入模块,然后才能对其进行访问。仅导入日志记录模块。碰巧这是一个带有子模块的软件包,但是那些子模块仍然不会自动加载

  • 我已经安装了Python 3.5附带的Lubuntu 16.04 LTS,但使用Python 2.7作为默认的Python解释器。< br >两个版本都没有安装< code>pip包。我只会使用3.5版本。因此,我安装了< code>pip3,其中包含: 然后我尝试更新版本(因为Ubuntu存储库有旧版本):$ pip3安装--升级pip3但是找不到包,并给我发了这条消息: 收集pip3<br>找

  • 问题内容: 我有一个正在构建的Python程序,可以通过以下两种方式之一运行:第一种是调用,它以友好的方式提示用户输入,然后通过该程序运行用户输入。另一种方法是调用“ ”,它将遍历所有友好的输入集合,并通过该程序一次运行整个文件的输入值。 问题是,当我运行时,它会从中导入一些变量/方法/等,并在运行此代码时: 在程序的第一行,它立即错误,因为它试图运行中的代码。 如何阻止Python运行要导入的“

  • 问题内容: 我了解,当您导入模块时,该文件会被编译成文件以使其更快吗?为什么主文件也没有编译为?这会减慢速度吗?那么将主文件保持得尽可能小会更好,还是没关系? 问题答案: 加载模块时,会将py文件“字节编译”为pyc文件。时间戳记录在pyc文件中。 这样做不是为了使其运行更快,而是使其加载更快。 因此,在加载模块时“字节编译”模块是有意义的。 http://docs.python.org/tuto

  • 我是Python新手,我仍然无法理解为什么我们需要一个文件来导入模块。我已经看过了其他的问题和答案,比如这个。 让我困惑的是,我可以在没有的情况下导入我的模块,那么为什么我需要它呢? 以我为例,, index.py, 模块/hello/hello.py, 模块/Hello/HelloWorld.py, 后果 只需要这两条线, 没有任何。有人能解释为什么它是这样工作的吗? 如果是正确的方法,我应该在

  • 问题内容: 导入标准“日志记录”模块会对一堆虚拟条目造成sys.modules污染: 因此,导入此软件包会将额外的名称放入sys.modules中,除了它们不是模块以外,仅引用None。其他模块(例如xml.dom和编码)也有此问题。为什么? 编辑: 在bobince的答案的基础上,有一些页面描述了功能的起源(请参阅“ sys.modules中的虚拟条目”部分)和功能的未来。 问题答案: 中的值是