2014-09-26 87 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