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

Mar*_*man 3 python types

给定类型的名称,有没有办法获取类型对象?因此,例如:

   get_type('str') -> str
Run Code Online (Sandbox Code Playgroud)

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

以前似乎不太可能没有人问过这个问题,但我已经搜索过但没有找到。

hee*_*ayl 5

您可以通过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
Run Code Online (Sandbox Code Playgroud)

FWIW,您可以AttributeError通过传递第三个参数来替换捕获,getattr当属性丢失时,该参数作为默认值(感谢@Error - Syntactical Remorse 的提醒):

def get_type(type_name):
    return getattr(builtins, type_name, None)
Run Code Online (Sandbox Code Playgroud)

为了处理自定义类型,您可以查看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
Run Code Online (Sandbox Code Playgroud)