如何在我的函数中替换`eval`?

时间:2014-03-03 19:54:02

标签: python map eval setattr

我非常清楚在Python中使用eval是不好的做法。这是我的代码:

from hashlib import * # added for clarification
def get_hash(self):
        if self.hash_type in ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']:
            data = eval(self.hash_type) # <--- how can I replace this?

我听说过setattr函数,但老实说我不知道​​如何实现它。

是否也可以使用map功能执行此操作?

请注意'md5', 'sha1', 'sha224'等是局部变量。当我在其中一个上使用eval函数时,它们就变成了函数。

2 个答案:

答案 0 :(得分:6)

您可以使用getattr

import hashlib
if self.hash_type in ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']:
     func = getattr(hashlib, self.hash_type)

答案 1 :(得分:3)

为什么不将所有信息存储在字典中?例如:

self.hash_types = {
    'md5': md5,
    'sha1': sha1,
    ...
}

然后在get_hash

def get_hash(self):
    if self.hash_type in self.hash_types:
        data = self.hash_types[self.hash_type]

可替换地,

def get_hash(self):
    data = self.hash_types.get(self.hash_type, self.DEFAULT)