Вы немного смущены тем, что вы пытаетесь сделать. Типы, также известные как классы, являются объектами, как и все остальное в python. Когда вы пишете int
в своих программах, вы ссылаетесь на глобальную переменную, называемую int
, которая оказывается классом. То, что вы пытаетесь сделать, это не «лить строку для ввода», она обращается к встроенным переменным по имени.
Как только вы это понимаете, решение легко увидеть:
def get_builtin(name):
return getattr(__builtins__, name)
Если вы действительно хотели превратить имя типа в типа, вот как вы это сделаете. Я использую deque
, чтобы выполнить обход дерева без рекурсии.
def gettype(name):
from collections import deque
# q is short for "queue", here
q = deque([object])
while q:
t = q.popleft()
if t.__name__ == name:
return t
else:
print 'not', t
try:
# Keep looking!
q.extend(t.__subclasses__())
except TypeError:
# type.__subclasses__ needs an argument, for whatever reason.
if t is type:
continue
else:
raise
else:
raise ValueError('No such type: %r' % name)