如何使用字典从一个模块加载到主程序从另一个模块加载之后呢?

2024-05-16 00:43:08 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我使用函数读取一个模块中文件的内容:

def get_objectstore():

    with open(os.getcwd() + "\\data.store", "rb") as infile:
        objA = cPickle.load(infile)
        objectstore = eval((str(objA)).translate(string.maketrans(coder, alpha)))
    return objectstore 

我从主程序中调用这个函数如下:

from main_vars import get_objectstore

objectstore=get_objectstore()

现在objectstore拥有了我的程序使用的所有图像和声音。我怎么用

objectstore

在所有其他模块中装入主程序。你知道吗


Tags: 模块文件函数内容datagetosdef
1条回答
网友
1楼 · 发布于 2024-05-16 00:43:08

How can I use objectstore in all other modules loaded into the main program.

这是你可以做的事情之一,但几乎可以肯定的是,你不应该这样做……所以首先我要解释怎么做,然后解释为什么不做。你知道吗


如果您希望某些东西在每个模块中都直接可用,而不必在每个模块中导入它,就像它是一个内置的一样…答案是将它添加到内置的。那么,你是怎么做到的?你知道吗

好吧,从技术上讲,没有保证安全的方法来做这件事,但实际上,我相信monkeypatching ^{}模块可以在每个主要实现的每个版本中工作。所以:

import builtins
builtins.objectstore = objectstore

请注意,在Python2.x中,模块名为^{},但工作方式相同。你知道吗


这在少数情况下不起作用,例如,exec运行的内部代码具有提供自定义globals的自定义__builtins__。如果你需要处理的话…好吧,你不能移动处理。但是,如果你只关心CPython(我认为是PyPy,但不是Jython,我不知道铁……),会怎么样?在CPython中,可以保证每个全局环境,即使是为compileexec等创建的环境,都将包含名为__builtins__的内容,这些内容要么是该环境的内置dict,要么是命名空间为该环境的内置dict的对象。如果根本没有内置程序,或者您正在查看内置程序模块本身的全局环境,那么它可能会丢失。所以,你可以这样写:

try:
    __builtins__['objectstore'] = objectstore
except AttributeError:
    __builtins__.objectstore = objectstore

(这不适用于在builtins名称空间本身中运行代码的情况,因为……老实说,我不确定您想在那里做什么。)

当然那很难看。那可能是故意的。你知道吗


你为什么不这么做?你知道吗

首先,它让你的代码更难阅读。任何查看您的代码的人都不知道objectstore是在哪里定义的,除非搜索一些完全不相关的模块,而这些模块甚至没有在当前模块中引用。你知道吗

另一方面,它会导致难以调试的问题。如果稍后更改哪些模块导入哪些其他模块的列表,则某些依赖于objectstore被修补的模块可能会在修补之前运行,因此会失败。你知道吗

另外,事实上没有文档记录您可以使用monkeypatch内置,或者这样做会影响内置环境,这是一个很好的迹象,表明您不应该依赖它。你知道吗

最好把你在做的事情说清楚。使objectstore成为其他模块从中导入的某个模块的全局模块。然后,即使是粗略的一瞥,也能立即清楚地知道发生了什么。你知道吗

例如,为什么不将objectstore = get_objectstore()添加到mainvars,然后让每个模块都执行from mainvars import objectstore?或者你甚至想让它成为一个单例,这样任何人都可以安全地调用get_objectstore(),并且知道他们都会得到一个单一的、共享的值。如果不确切地知道你想要完成什么,就很难提出一个最佳的解决方案。我可以肯定的是,对于您可能尝试完成的几乎任何事情,使objectstore成为一个内置式的跨模块全局的解决方案都不太可能是最佳的解决方案。你知道吗

相关问题 更多 >