如何在不预先拆分的情况下将元组用于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
相关产品推荐
相关产品推荐

