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

时间:2016-02-19 22:40:00

标签: 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()

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

例如,是否可以获取对定义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)

2 个答案:

答案 0 :(得分:1)

Python中的新式类有一个名为__subclasses__的方法,它返回到目前为止已定义的所有直接子类的列表。您可以使用它来获取示例中的A类,只需调用BASE_A.__subclasses__()(如果您使用的是Python 2,则还需要更改{{1}从BASE_A继承。有关更多详细信息,请参阅this question and its answers(尤其是递归获取所有子类的函数)。

至于获取对实例的访问权限,为此您可能应该向基类添加一些代码,可能将object创建的实例保存到某种数据结构中(例如__new__) 。有关该部分的更多信息,请参阅this question and its answers。实际上,现在我考虑一下,如果你将实例放在某个地方的集中数据结构中(例如不在每个子类的属性中),你可能不需要该函数来搜索类,因为你可以只检查{ {1}}实例并找到正在使用的子类。

答案 1 :(得分:0)

你的问题有点不合逻辑。

由于Python按顺序解释代码:m<-(transpose(data.frame(apply(df, 1, sort)))) ## Sort the dataframe, transpose it back to normal m<-data.frame(d=m$V1, a=m$V2, t=m$V3) #Rename the columns cols <- c('d','a','t') #select the columns you want to paste together m$x <- do.call(paste, c(m[cols], sep=",")) #create the new column with pasted columns m d a t x 1 2 bb cat 2,bb,cat 2 3 bat cc 3,bat,cc 3 5 sat xx 5,sat,xx 之前未定义b

如果您可以在a initialization之前设置b,那么:

a

我不建议这样做,因为我发现这不干净。由于您依赖于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() 中的b,因此您应将其作为参数传递给a