我不知道爲什麼準確列表的__str__
方法返回一個包含在對象的__repr__
- 所以我看着它:[Python-3000] PEP: str(container) should call str(item), not repr(item)
參數吧:
- - 容器拒絕猜測用戶想要在str(容器)上看到什麼 - 環境,分隔符等等;
- 再版(項)通常顯示類型信息 - 周圍的字符串,類名撇號等
所以它是關於究竟是在列表中更清晰(因爲對象的字符串表示可以有逗號等)。該行爲不會消失,每吉「BDFL」範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)
行爲是在這裏留下來。
很棒的回答。我只是想指出,有一種更習慣的方式來表達你爲'__str__'編寫的代碼:'def __str __(self):items =「,」.join([str(item)for item in self]);返回「[{0}]」.format(items)'(顯然,分成多行)。要點是'join'是在列表中的每個項目之間插入','(或其他字符串)的首選方式。 – hangtwenty 2013-06-14 12:19:15