Python:如何获取另一个模块中定义的所有局部变量



有没有办法获取对不同模块中定义的局部变量的引用?

例如,我有两个文件:framework.py 和 user_code.py:

framework.py:

from kivy.app import App
class BASE_A:
    pass
class MyApp(App):
    def on_start(self):
        '''Here I'd like to get a reference to sub-classes of BASE_A and
        instantiated objects of these sub-classes, defined in the file
        "user_code.py" such as a1, a2, as well as the class A itself,
        without explicitly passing them to MyApp's instance.
        '''

user_code.py:

from framework import MyApp
class A(BASE_A):
    pass
app = MyApp()
a1 = A()
a2 = A()
app.run()

我想做的是以某种方式获取对对象 a1a2 以及类 A 的引用,这些对象都是在 user_code.py 中定义的。我想在 app.run() 中调用的方法 on_start 中使用它们。

例如,是否可以获取对定义 MyApp 对象的作用域的引用 (user_code.py)?

任何感兴趣的人的一些背景:

我知道这是一个有点奇怪的问题,但原因是:

我正在编写一个python框架,用于为基于Arduino的自制仪器创建定制的GUI控制程序。它被称为Instrumentino(坐在GitHub上),我目前正在开发版本2。

对于使用该框架的人,他们需要定义一个系统描述文件(示例中user_code.py),在其中声明他们在系统中使用的部分(python对象)以及系统应执行的操作类型(python类)。

我试图实现的是自动识别MyApp on_start中的这些对象和类,而不要求用户显式传递这些对象和类,以使用户代码更清晰。避免代码的含义如下:

app.add_object(a1)
app.add_object(a2)
app.add_class(A)

Python 中的新式类有一个名为 __subclasses__ 的方法,该方法返回到目前为止已定义的所有直接子类的列表。您可以使用它来获取示例中的A类,只需调用 BASE_A.__subclasses__()(如果您使用的是 Python 2,您还需要更改BASE_A以继承自 object)。有关更多详细信息,请参阅此问题及其答案(尤其是递归获取所有子类的函数)。

至于访问实例,为此您可能应该向基类添加一些代码,也许将__new__创建的实例保存到某种数据结构中(例如weakset)。有关该部分的更多信息,请参阅此问题及其答案。实际上,现在我想到了,如果你把你的实例放在一个集中的数据结构中(例如,不是在每个子类的属性中),你可能不需要这个函数来搜索类,因为你只需要检查实例的type并找到正在使用的子类。

你的问题有点不合逻辑。

由于 Python 按顺序解释代码:b 不是在 a initialization 之前定义的。

如果可以在a之前设置b,则:

b = None # global variable
class A():
    global b
    def __init__(self):
        '''Here I'd like to get a reference to b (of type B) without passing it as an argument'''
class B_BASE():
    pass
class B(B_BASE):
    def __init__(self):
        pass
if __name__ == '__main__':
    b = B()
    a = A()

我不建议这样做,因为我发现这不干净。由于您依赖于a中的b,因此应将其作为参数传递给A class

最新更新