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

如何在不预先拆分的情况下将元组用于string.format方法

解决str.format重构时的索引错误及更优写法

你遇到的IndexError是因为item是一个二元元组((key, value)),而'{!s}={!r}'.format(item)是把整个元组作为单个参数传给format,但格式字符串里有两个占位符,自然会提示索引越界。

更优的一行式重构方案

直接用元组解包操作*item,把元组里的key和value分别传给format的两个参数,这样可以用生成器表达式(比列表推导更节省内存)替代显式循环:

', '.join('{!s}={!r}'.format(*item) for item in list)

结合你的__repr__方法完整优化

把这段逻辑整合到你的类的__repr__里,代码会更简洁紧凑,同时保持可读性:

def __repr__(self):
    """
    This method returns a string representation of the object such that eval() can recreate the object. The class attributes will be ordered e.g. Class(attribute1='String', attribute2=3)
    """
    # 排序类属性的键值对
    sorted_attrs = sorted(vars(self).items(), key=lambda tup: tup[0])
    # 用生成器表达式拼接属性字符串
    args_str = ', '.join('{!s}={!r}'.format(*attr) for attr in sorted_attrs)
    return '{!s}({!s})'.format(type(self).__name__, args_str)

为什么这个方案更好?

  • 去掉了冗余的中间列表arguments和显式的for循环,代码更简洁
  • 使用生成器表达式替代列表推导,不需要额外创建完整的列表对象,内存效率更高(尤其当类属性很多时)
  • 元组解包*item的写法直观,清晰对应格式字符串里的两个占位符,可读性强

内容的提问来源于stack exchange,提问作者Benedikt Bock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:48:23