使用更好的

2024-05-05 18:08:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用更好的函数替换下例中的“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:]

Tags: 函数nameformatdictionarytypeevalmsgtesting
2条回答

对于您试图实现的目标,只要classes字典没有(不可信的)用户输入,它可能不是最糟糕的选择。你知道吗

为了改进代码,当您同时控制字典时,请考虑将类放在字典中,而不是放在类名中。这将更优雅地解决问题。你知道吗

像这样的

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

可以避免在字符串和python对象/类之间进行转换。你知道吗

您可以将类本身(而不是它们的名称)存储为字典中的值。那你就可以

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,即在将类名插入字典时,删除类名周围的引号。你知道吗

相关问题 更多 >