我不确定 为什么 列表的 __str__ 方法究竟会返回其中包含的对象的 __repr__ - 所以我查了一下:[Python-3000] PEP: str(container) should call str(item), not repr(item)
它的论据:
--容器拒绝猜测用户想在str(container)上看到什么——环境、分隔符等等;
-- repr(item) 通常显示类型信息 - 字符串、类名等周围的撇号。
所以更清楚地知道列表中的确切内容(因为对象的字符串表示可能有逗号等)。根据 Guido "BDFL" van Rossum 的说法,这种行为不会消失:
让我为大家节省很多
时间并说我反对这个
改变,我相信它
会造成太多的干扰
在接近测试版的情况下被接受。
现在,有两种方法可以为您的代码解决此问题。
首先是继承list并实现自己的__str__方法。
class StrList(list):
def __str__(self):
string = "["
for index, item in enumerate(self):
string += str(item)
if index != len(self)-1:
string += ", "
return string + "]"
class myClass(object):
def __str__(self):
return "myClass"
def __repr__(self):
return object.__repr__(self)
现在来测试一下:
>>> objects = [myClass() for _ in xrange(10)]
>>> print objects
[<__main__.myClass object at 0x02880DB0>, #...
>>> objects = StrList(objects)
>>> print objects
[myClass, myClass, myClass #...
>>> import random
>>> sample = random.sample(objects, 4)
>>> print sample
[<__main__.myClass object at 0x02880F10>, ...
我个人认为这是一个糟糕的主意。一些函数——例如random.sample,如图所示——实际上返回list对象——即使你对列表进行了子分类。所以如果你走这条路,可能会有很多result = strList(function(mylist)) 调用,这可能是低效的。这也是一个坏主意,因为您可能有一半的代码使用常规的list 对象,因为您不打印它们,而另一半使用strList 对象,这可能导致您的代码变得更加混乱和混乱.尽管如此,选项仍然存在,这是让 print 函数(或 2.x 中的语句)按照您希望的方式运行的唯一方法。
另一种解决方案是编写你自己的函数strList(),它以你想要的方式返回字符串:
def strList(theList):
string = "["
for index, item in enumerate(theList):
string += str(item)
if index != len(theList)-1:
string += ", "
return string + "]"
>>> mylist = [myClass() for _ in xrange(10)]
>>> print strList(mylist)
[myClass, myClass, myClass #...
不幸的是,这两种解决方案都要求您重构现有代码 - 但 str(container) 的行为将继续存在。