2017-10-09 86 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的行数,即删除类中的引号名字,当你把它放进字典里。