我想取代' 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 :(得分:0)
对于您尝试实现的目标,可能不是最糟糕的选择,只要类字典不是(不可信)用户输入。
为了改进代码,当您控制字典时,请考虑将类放在字典中而不是类名中。这样可以更好地解决问题。
像
这样的东西class A:
pass
class B:
pass
myclasses = [A, B]
for cls in myclasses:
print cls.__name__
是可能的,并且避免在字符串和python对象/类之间进行转换。
答案 1 :(得分: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:]
在最后两行,我已将eval(class_name)
替换为chosen_class
。这可以通过两件事来实现:
class_name
更改为chosen_class
(这只是一个装饰性细节)SIP.supported_classes_dictionary
。由于您未在代码示例中显示如何执行此操作,因此我无法向您显示必须进行的更改,但可能会将d[some_message_type] = 'SomeClass'
更改为d[some_message_type] = SomeClass
也就是说,当你把它粘在字典中时,删除你的类名周围的引号。