1 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
官方文檔將此概述為您應(yīng)該如何處理 __repr__:
由 repr() 內(nèi)置函數(shù)調(diào)用以計(jì)算對(duì)象的“官方”字符串表示形式。如果可能的話,這應(yīng)該看起來像一個(gè)有效的 Python 表達(dá)式,可用于重新創(chuàng)建具有相同值的對(duì)象(給定適當(dāng)?shù)沫h(huán)境)。如果這不可能,則應(yīng)返回 <...some useful description...> 形式的字符串。返回值必須是字符串對(duì)象。如果一個(gè)類定義了 __repr__() 而不是 __str__(),那么當(dāng)需要該類實(shí)例的“非正式”字符串表示時(shí),也會(huì)使用 __repr__()。
這通常用于調(diào)試,因此表示信息豐富且明確非常重要。
列表、字符串、集合、元組和字典都在它們的 __repr__ 方法中打印出它們的整個(gè)集合。
您當(dāng)前的代碼看起來完全遵循文檔建議的示例。盡管我建議更改您的 __init__ 方法,使其看起來更像這樣:
class MyCollection:
def __init__(self, objects=None):
if objects is None:
objects = []
self._objects = objects
def __repr__(self):
return f"MyCollection({self._objects})"
您通常希望避免使用可變對(duì)象作為默認(rèn)參數(shù)。從技術(shù)上講,由于您的方法是使用 extend (它制作列表的副本)實(shí)現(xiàn)的,它仍然可以很好地工作,但是 Python 的文檔仍然建議您避免這種情況。
不使用可變對(duì)象作為默認(rèn)值是一種很好的編程習(xí)慣。相反,使用 None 作為默認(rèn)值并在函數(shù)內(nèi)部檢查參數(shù)是否為 None 并創(chuàng)建一個(gè)新的列表/字典/無論是否是。
https://docs.python.org/3/faq/programming.html#why-are-default-values-shared-between-objects
如果您對(duì)另一個(gè)庫如何以不同方式處理它感興趣,當(dāng)數(shù)組長度大于 1,000 時(shí),Numpy 數(shù)組的 repr 僅顯示前三項(xiàng)和后三項(xiàng)。它還對(duì)項(xiàng)目進(jìn)行格式化,以便它們都使用相同數(shù)量的空間(在下面的示例中,1000 占用四個(gè)空間,因此 0 必須用另外三個(gè)空間填充才能匹配)。
>>> repr(np.array([i for i in range(1001)]))
'array([ 0, 1, 2, ..., 998, 999, 1000])'
要模仿這種 numpy 數(shù)組樣式,您可以在您的類中實(shí)現(xiàn)這樣的 __repr__ 方法:
class MyCollection:
def __init__(self, objects=None):
if objects is None:
objects = []
self._objects = objects
def __repr__(self):
# If length is less than 1,000 return the full list.
if len(self._objects) < 1000:
return f"MyCollection({self._objects})"
else:
# Get the first and last three items
items_to_display = self._objects[:3] + self._objects[-3:]
# Find the which item has the longest repr
max_length_repr = max(items_to_display, key=lambda x: len(repr(x)))
# Get the length of the item with the longest repr
padding = len(repr(max_length_repr))
# Create a list of the reprs of each item and apply the padding
values = [repr(item).rjust(padding) for item in items_to_display]
# Insert the '...' inbetween the 3rd and 4th item
values.insert(3, '...')
# Convert the list to a string joined by commas
array_as_string = ', '.join(values)
return f"MyCollection([{array_as_string}])"
>>> repr(MyCollection([1,2,3,4]))
'MyCollection([1, 2, 3, 4])'
>>> repr(MyCollection([i for i in range(1001)]))
'MyCollection([ 0, 1, 2, ..., 998, 999, 1000])'
添加回答
舉報(bào)