0

我的应用程序读取 python 脚本:

a = MyObject("a")
b = MyObject("b")

my_objects = [a, b]

以下代码加载文件并获取my_objects(省略解析错误的例外情况):

_config = __import__(file_name)
if hasattr(_config, "my_objects"):
    v = getattr(_config, "my_objects")

它可以工作,但我希望 MyObject 在文件解析期间能够访问另一个对象。我发现的唯一方法是在单独的 python ( ) 文件中声明一个全局变量globs.py以避免循环导入错误:

_cached_instance

然后我的对象的代码是:

import globs

class MyObject(Object):
    def __init__(self):
        self.cache_instance = globs._cached_instance

它有效......但不是很优雅。全局变量的使用使测试变得困难(并且具有奇怪的边界效应)。我正在寻找一种更优雅的方式来在加载 python 脚本期间“注入”_cached_instance 并使其仅在脚本中可用。有任何想法吗 ?

4

1 回答 1

1

我能想到的最好的方法是使用初始化函数,但这当然不会在解析期间运行,而是在不久之后运行:

测试.py

my_objects = None

def update(foo):
    globals()['my_objects'] = [foo, foo+1]

测试2.py

_config = __import__("test")
_config.update(2) 
print _config.my_objects

有很多想法,但大多数都涉及在导入后弄乱导入的模块,而不是在解析期间。

使变量可用的一种方法是__builtin__在调用导入之前更改调用模块的(test2),但这对我来说似乎是一个很大的黑客攻击。请参阅此讨论中接受的答案: Python:如何创建跨模块变量?

于 2013-09-17T09:33:14.977 回答