Python中使用getattr()与types.builtins进行类型转换的问题排查
问题:通过getattr实现动态类型转换时触发AttributeError错误
我想写一个casting()函数,用getattr()实现动态数据类型转换,但函数跑不起来。代码里导入了types和inspect模块,尝试通过getattr(types.builtins, string_type)(data)执行转换,结果触发AttributeError,提示“module 'types' has no attribute 'builtins'”。我查文档和用代码验证,以为int属于types.builtins,但实际调用还是报错,求正确实现方式。
原代码:
import types, inspect def casting(data='123', string_type='int'): try: return getattr(types.builtins, string_type)(data) except: return None
错误示例:
>>> print(getattr(types.builtins, 'int')('123')) AttributeError: module 'types' has no attribute 'builtins
验证代码:
>>> print(inspect.getmembers(types)[29][1]['__name__']) builtins
原因分析与修复方法
错误原因:
types模块里并没有直接对外暴露builtins属性,你用inspect.getmembers(types)[29][1]拿到的是Python内置的builtins模块对象,但它不是types的直接可访问属性,所以直接写types.builtins会触发属性不存在的错误。正确实现方式1:导入builtins模块
Python的所有内置类型(如int、str、float)都定义在builtins模块中,直接导入该模块并通过getattr获取转换函数即可:
import builtins def casting(data='123', string_type='int'): try: converter = getattr(builtins, string_type) return converter(data) except (AttributeError, ValueError): # 明确捕获类型不存在或转换失败的异常,避免裸except捕获无关错误 return None
- 正确实现方式2:使用全局__builtins__对象
如果不想额外导入模块,也可以直接使用Python全局环境中的__builtins__对象来获取内置类型:
def casting(data='123', string_type='int'): try: converter = getattr(__builtins__, string_type) return converter(data) except (AttributeError, ValueError): return None
- 优化提示:原代码使用了裸
except语句,这会捕获所有异常(包括程序中断信号等),不利于问题排查和函数稳定性。建议明确捕获AttributeError(指定的类型名称不存在)和ValueError(数据无法转换为目标类型)两种异常。
内容的提问来源于stack exchange,提问作者ahmedul Kabir Omi
相关产品推荐
相关产品推荐

