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

Python:从类型对象的名称中获取类型对象?,python,types,Python,Types,如果给定类型的名称,是否有方法获取类型对象? 例如: get_type('str') -> str 我正在构建一个dict将各种情况映射到一个类,该类应该被实例化以处理它们。把所有东西都进口,冒着循环进口的风险,似乎有点过头了。所以我想我可以用字符串指定它们,并在使用点查找类型。但是我如何查找类型 似乎以前没有人问过这个问题,但我已经搜索过了,没有找到它。您可以通过使用getattr检查内置模块上的属性来获取内置类型: In [665]: import builtins In [

如果给定类型的名称,是否有方法获取类型对象? 例如:

   get_type('str') -> str
我正在构建一个
dict
将各种情况映射到一个类,该类应该被实例化以处理它们。把所有东西都进口,冒着循环进口的风险,似乎有点过头了。所以我想我可以用字符串指定它们,并在使用点查找类型。但是我如何查找类型


似乎以前没有人问过这个问题,但我已经搜索过了,没有找到它。

您可以通过使用
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,您可以通过将第三个参数传递给
getattr
来替换
AttributeError
捕获,该参数在属性丢失时作为默认值(感谢@Error-Syntactical reforse的提醒):


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

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
[670]中的
:定义获取类型(类型名称):
…:试试看:
…:返回getattr(内置,键入\u名称)
…:除属性错误外:
…:试试看:
…:obj=globals()[type_name]
…:除键错误外:
…:返回无
…:如果isinstance(对象,类型)为None,则返回repr(对象),否则为None
...:                                                                                                                                                                                                          
在[671]中:B类:
…:通过
...:                                                                                                                                                                                                   
在[672]中:get_类型('B')
输出[672]:“”
在[673]中,get_type('C')是None
Out[673]:对

Import,并在实际遇到问题时担心解决循环导入。这是@AndrejKesely建议的,但我现在找不到它:>>>来自bs4 Import beautifulsou>>>globals()['beautifulsou']对于非内置项,它似乎工作得很好。存储字符串的目的是让dict将某个字符串映射到
“BeautifulSoup”
,从而允许延迟实际导入。@chepner是的,我知道。那么?你的评论不会推迟导入。你也可以通过使用
\uuuuu builtins\uuuuuu
:)@heemayl跳过导入,这可以为自定义类型完成吗?例如,如果我定义了
类A
,那么
get_type('A')
应该返回
@Error syntacticalreforme,它们是相同的对象。试试
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。使用dunder模块在我看来并不漂亮。@AndrejKesely使用上面的
try/except
,并在
except
中执行以下操作:
getattr(sys.modules[\uu name\uuu],type\u name,None)
,这将捕获您自己的类实例。@AndrejKesely检查我的编辑。
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