You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:52:26