2014-09-26 96 views
1

如何使用eval在其他类中创建类定义?使用Python eval评估类

evalstr = str("class MyScreen(Screen):\n\tpass\n") 
eval(evalstr) 

我想在其他类方法中执行此代码。但它返回一个错误。

+0

请更新你所得到的错误并产生错误(即上面的代码的上下文中)的代码的问题。 – isedev 2014-09-26 17:13:31

+0

如果这是问题的核心,那么可以使用'type'动态创建类型。 – matsjoyce 2014-09-26 17:17:51

+1

你为什么要这样做? – jonrsharpe 2014-09-26 17:18:03

回答

1

你想execeval这里(的安全问题除外)

evalstr = str("class MyScreen(Screen):\n\tpass\n") 
exec(evalstr) 

eval将只计算表达式,并返回它的值。 exec用于执行任意代码字符串作为语句,这是您在此处需要的。

但严重的是,这是一个等待大多数情况下发生的安全灾难,考虑替代方案(如将代码编写为字符串)。编辑: Chepner的答案可能是正确的选择。

+0

当然,很容易滥用'exec',在大多数情况下(比如这个),有更好的方法来达到预期的结果。但是如果你可以保证**它的参数是[sane](http://xkcd.com/327/),那么使用'exec'不应该是一个安全问题。或者是?当然,大多数随便使用'exec'的人不会(或不能)确保他们正在执行的代码被正确清理...... – 2014-09-26 20:13:19

+0

@ PM2Ring在此使用'exec'或'eval'案例告诉我,字符串在运行时间之前不会被知道。然而,仔细看看这个问题,似乎OP没有意识到你可以嵌套类。你说得对,如果代码被消毒了,那当然是安全的。 – 2014-09-27 19:18:39

+0

我同意这种情况表明字符串在运行时间之前不会被知道。我想我们都同意,首先避免使用'exec'或'eval'通常比正确清理这些字符串更容易,尤其是在很大程度上依赖于用户输入的情况下。我只是提到,虽然使用'exec'或'eval'可能会有风险,但它们并不具有内在风险。 – 2014-09-27 19:41:26

1

您不能使用eval,因为class是一个语句,而eval仅评估表达式,而不是语句。您可以使用exec

4

使用type函数:

MyScreen = type("MyScreen", (Screen,), {}) 

这是创建在运行时类的正确方法(其实本质上是什么执行class声明呢,因为type也是默认元类在Python中)。

您也可以简单地将类定义为“正常”方式;有没什么可说的一个class语句必须是在模块的全球一级:

class Something(object): 

    # Define a new class here... 
    class MyScreen(Screen): 
     pass 

    def __init__(self): 
     """Initialize a Something object""" 
     # ... or here 
     class MyScreen(Screen): 
      pass