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