2017-10-09 64 views
0

我想在下面的例子中用'更好的函數替換'eval'。經過研究,我的理解是,使用這不是一個好主意。用於更好的替代eval功能

class_name = '{}'.format(SIP.supported_classes_dictionary[msg_type]) 
print 'Testing {}'.format(eval(class_name).supported_sip_services[msg_type]) 
variable_array = eval(class_name).fields_desc[2:] 

回答

0

只要類字典是沒有(不可信的)用戶輸入,你試圖實現它的可能不是最差的選擇。

爲了改進代碼,當您控制字典時,請考慮將類放在字典中而不是類名。這將解決問題更加優雅。

喜歡的東西

class A: 
    pass 
class B: 
    pass 
myclasses = [A, B] 
for cls in myclasses: 
    print cls.__name__ 

是可能的,字符串和Python對象/類之間避免轉換。

+0

小問題:'os'和'sys'不是類,它們是模塊。當然,它也適用於課程。 – jacg

+0

奧普斯的確如此。有其他的想法。我改變了答案。 – allo

0

您可以將這些類本身而不是它們的名稱作爲字典中的值存儲。然後,你將能夠做到

chosen_class = SIP.supported_classes_dictionary[msg_type] 
print 'Testing {}'.format(chosen_class.supported_sip_services[msg_type]) 
variable_arry = chosen_class.fields_desc[2:] 

在最後兩行我曾經使用過chosen_class代替你eval(class_name)。這是由兩件事情成爲可能:

  1. class_namechosen_class第一行更改變量名(這只是一個化妝品的細節)
  2. Populanting SIP.supported_classes_dictionary帶班,而不是字符串。由於您沒有向您展示如何在代碼示例中執行此操作,因此我無法向您顯示必須進行的確切更改,但可能會改變d[some_message_type] = 'SomeClass'd[some_message_type] = SomeClass的行數,即刪除類中的引號名字,當你把它放進字典裏。