Как я могу заменить `eval` в моей функции?

Я очень хорошо знаю, что это не очень хорошая практика использования eval в Python. Вот мой код:

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 ответа

Решение

Ты можешь использовать getattr:

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

Почему бы не хранить всю информацию в словаре? Например:

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)
Другие вопросы по тегам