将作为字符串提供的python类源代码编译为可调用对象

将作为字符串提供的python类源代码编译为可调用对象,python,Python,考虑将此类作为字符串提供(不在文件中,我无法将其放入文件中): 我试图编译并执行以下内容(在伪Python中)。请注意,实际的类名A并不重要——只是它包含我将调用的方法show()。是的,一个健壮的示例将执行getattr,并检查是否可调用,但要点如下: clazz = compile(cstr) instance = clazz() instance.show("hello") 在import和importlib上有大量的资料,它们将字符串作为文件和路径,而不是直接字符串作为输入 我尝

考虑将此类作为字符串提供(不在文件中,我无法将其放入文件中):

我试图编译并执行以下内容(在伪Python中)。请注意,实际的类名
A
并不重要——只是它包含我将调用的方法
show()
。是的,一个健壮的示例将执行
getattr
,并检查是否可调用,但要点如下:

clazz = compile(cstr)
instance = clazz()   
instance.show("hello")
import
importlib
上有大量的资料,它们将字符串作为文件和路径,而不是直接字符串作为输入

我尝试使用
StringIO
创建一个类似文件的对象,该对象可以传递给
import
,但似乎也没有从stream工具导入


这个问题被标记为可能的重复,但对另一个问题的引用,与大多数问题一样,涉及代码中已经存在的类定义,这些类定义已经在中编译,然后通过名称实例化,例如“a”。想象一下,一个交互式GUI带有一个窗口,可以在python中输入类def。我把它捕捉为一个字符串。现在怎么办?

执行该字符串的结果的可能副本将是包含类定义的命名空间。它不会神奇地给你类本身,仅仅因为它是名称空间中唯一的东西;您必须在名称空间中显式查找名称
A
,并调用该名称,以便让您的实例调用
.show()
。@jasonharper如果我使用实际的
编译(str,filename,mode)
函数,它将返回一个类型为“code”的对象,但实际上没有太多功能;我认为它甚至没有被添加到名称空间中进行查找。
compile()
需要额外的工作才能将结果转换为可调用的形式
exec
是一种更简单的方法,将字典作为其全局环境传递,您可以在那里找到
a
。是的,
exec
看起来是最好的方法。你应该把它作为答案贴出来。
clazz = compile(cstr)
instance = clazz()   
instance.show("hello")