eval的替换功能更好

时间:2017-10-09 13:12:22

标签: python python-2.7 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:]

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。这可以通过两件事来实现:

  1. 将第一行的变量名称从class_name更改为chosen_class(这只是一个装饰性细节)
  2. 使用类而不是字符串来推广SIP.supported_classes_dictionary。由于您未在代码示例中显示如何执行此操作,因此我无法向您显示必须进行的更改,但可能会将d[some_message_type] = 'SomeClass'更改为d[some_message_type] = SomeClass也就是说,当你把它粘在字典中时,删除你的类名周围的引号。