В вашем первом примере, где a = float
, a
- встроенная функция, а во втором - a = u"float"
, a
- строка в кодировке Unicode. Если вы хотите, чтобы полная «динамичность» встроенного типа конвертировалась без необходимости создания отображения, вы можете сделать это:
# for Python 2
a = u"float"
b = "123.123"
import __builtin__
print getattr(__builtin__, a.decode())(b)
# 123.123
# for Python 3+
a = u"float"
b = "123.123"
import builtins
print(getattr(builtins, a)(b))
# 123.123
Я бы посоветовал вам не использовать eval()
(как предлагает другой ответ ), поскольку это может привести к серьезным рискам безопасности. Вот почему я использовал модуль __builtin__
/ builtins
и getattr()
для получения функции float(...)
.
Вы также можете создать отображение (т. Е. A dict
) для сопоставления строки Юникода с соответствующей функцией (предложенной этим комментарием ):
# both Python 2 and 3
a = u"float"
b = "123.123"
mapping = {u"float": float, u"int": int, u"str": str, u"list": list}
print(mapping[a](b))
# 123.123
Использование сопоставления является наиболее безопасным способом, но оно ограничивает вашу «динамичность» только типами, перечисленными в сопоставлении.