Python:从名称中获取类型对象?

时间:2019-06-27 19:24:02

标签: python types

在给定类型名称的情况下,是否可以获取类型对象? 因此,例如:

   get_type('str') -> str

我正在构建一个dict,将各种情况映射到一个应实例化以处理它们的类。进口所有物品似乎过大,冒着循环进口的风险。所以我想我可以用字符串指定它们,并在使用时查找类型。但是,如何查找类型?

似乎以前没有问过这个问题的可能性很小,但我已经搜索过但未找到它。

1 个答案:

答案 0 :(得分:4)

您可以使用builtins通过检查getattr模块上的属性来获取内置类型:

In [665]: import builtins 
In [666]: def get_type(type_name): 
     ...:     try: 
     ...:         return getattr(builtins, type_name) 
     ...:     except AttributeError: 
     ...:         return None 
     ...:                                                                                                                                                                                                   

In [667]: get_type('str')                                                                                                                                                                                   
Out[667]: str

In [668]: get_type('list')                                                                                                                                                                                  
Out[668]: list

In [669]: get_type('dict')                                                                                                                                                                                  
Out[669]: dict

FWIW,您可以通过将第三个参数传递给AttributeError来代替getattr捕获,该属性将在缺少属性时用作默认值(感谢@Error-提示的语法后悔):

def get_type(type_name):
    return getattr(builtins, type_name, None)

要处理自定义类型,您可以查看globals字典:

In [670]: def get_type(type_name): 
     ...:     try: 
     ...:         return getattr(builtins, type_name) 
     ...:     except AttributeError: 
     ...:         try: 
     ...:             obj = globals()[type_name] 
     ...:         except KeyError: 
     ...:             return None 
     ...:         return repr(obj) if isinstance(obj, type) else None 
     ...:                                                                                                                                                                                                          

In [671]: class B: 
     ...:     pass 
     ...:                                                                                                                                                                                                   

In [672]: get_type('B')                                                                                                                                                                                     
Out[672]: "<class '__main__.B'>"

In [673]: get_type('C') is None
Out[673]: True