如何使用eval在其他類中創建類定義?使用Python eval評估類
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
我想在其他類方法中執行此代碼。但它返回一個錯誤。
如何使用eval在其他類中創建類定義?使用Python eval評估類
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
我想在其他類方法中執行此代碼。但它返回一個錯誤。
你想exec
不eval
這裏(的安全問題除外)
evalstr = str("class MyScreen(Screen):\n\tpass\n")
exec(evalstr)
eval
將只計算表達式,並返回它的值。 exec
用於執行任意代碼字符串作爲語句,這是您在此處需要的。
但嚴重的是,這是一個等待大多數情況下發生的安全災難,考慮替代方案(如將代碼編寫爲字符串)。編輯: Chepner的答案可能是正確的選擇。
當然,很容易濫用'exec',在大多數情況下(比如這個),有更好的方法來達到預期的結果。但是如果你可以保證**它的參數是[sane](http://xkcd.com/327/),那麼使用'exec'不應該是一個安全問題。或者是?當然,大多數隨便使用'exec'的人不會(或不能)確保他們正在執行的代碼被正確清理...... – 2014-09-26 20:13:19
@ PM2Ring在此使用'exec'或'eval'案例告訴我,字符串在運行時間之前不會被知道。然而,仔細看看這個問題,似乎OP沒有意識到你可以嵌套類。你說得對,如果代碼被消毒了,那當然是安全的。 – 2014-09-27 19:18:39
我同意這種情況表明字符串在運行時間之前不會被知道。我想我們都同意,首先避免使用'exec'或'eval'通常比正確清理這些字符串更容易,尤其是在很大程度上依賴於用戶輸入的情況下。我只是提到,雖然使用'exec'或'eval'可能會有風險,但它們並不具有內在風險。 – 2014-09-27 19:41:26
您不能使用eval
,因爲class
是一個語句,而eval
僅評估表達式,而不是語句。您可以使用exec
。
使用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
請更新你所得到的錯誤併產生錯誤(即上面的代碼的上下文中)的代碼的問題。 – isedev 2014-09-26 17:13:31
如果這是問題的核心,那麼可以使用'type'動態創建類型。 – matsjoyce 2014-09-26 17:17:51
你爲什麼要這樣做? – jonrsharpe 2014-09-26 17:18:03