Как я могу заменить `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)