Комментарии свидетельствуют о том, что вы недовольны идеей использования eval для генерации данных. поиск функции в __builtins__
позволяет найти eval
.
самое простое решение выглядит следующим образом:
import __builtin__
def parseInput(typename, value):
return getattr(__builtins__,typename)(value)
Вы бы использовали это так:
>>> parseInput("int", "123")
123
прохладный. работает довольно хорошо. а как насчет этого?
>>> parseInput("eval", 'eval(compile("print \'Code injection?\'","","single"))')
Code injection?
делает ли это то, что вы ожидаете? Если вы явно не хотите этого, вам нужно что-то сделать, чтобы предотвратить ненадежные входные данные в вашем пространстве имен. Я бы настоятельно рекомендовал простой белый список, изящно вызывающий какое-то исключение в случае неправильного ввода, например:
import __builtin__
def parseInput(typename, value):
return {"int":int, "float":float, "str":str}[typename](value)
но если вы просто не можете этого вынести, вы все равно можете добавить немного брони, проверив, что запрошенная функция действительно является типом:
import __builtin__
def parseInput(typename, value):
typector = getattr(__builtins__,typename)
if type(typector) is type:
return typector(value)
else:
return None