如何使用从一个模块加载到另一个模块的主程序中的字典?

时间:2014-09-02 18:55:55

标签: python dictionary global

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

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

在加载到主程序中的所有其他模块中。

1 个答案:

答案 0 :(得分:2)

  

如何在加载到主程序中的所有其他模块中使用objectstore

这是你可以做的事情之一,但几乎肯定不应该 ......所以首先我会解释如何,然后解释原因。


如果你想在每个模块中直接使用某些东西,而不必在每个模块中导入它,就好像它是内置的......答案是将它添加到内置函数中。那么,你是怎么做到的?

嗯,从技术上讲,没有保证安全的方法,但实际上,我认为monkeypatching builtins模块适用于每个主要实现的每个版本。所以:

import builtins
builtins.objectstore = objectstore

请注意,在Python 2.x中,模块名为__builtin__,但工作方式相同。


这在少数情况下不起作用,例如,内部代码由exec运行,其自定义globals提供自定义__builtins__。如果你需要处理......好吧,你无法轻松处理它。但是如果你只关心CPython(我认为PyPy,但不是Jython,我不知道Iron ......)会怎样?在CPython中,保证每个全局环境,甚至为compileexec等创建的环境都将包含名为__builtins__的内容,该内容可以是该环境的内置字典,也可以是某些内容。其名称空间是环境的内置字典的对象。如果根本没有内置函数,或者您正在查看内置模块本身的全局环境,则可能会丢失它。所以,你可以这样写:

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成为类似内置的跨模块全局不太可能是几乎任何你想要完成的事情的最佳解决方案。