第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用集合類 Python 的 __repr__ 的最佳實(shí)踐是什么?

使用集合類 Python 的 __repr__ 的最佳實(shí)踐是什么?

FFIVE 2023-03-08 10:01:27
我有一個(gè)自定義 Python 類,它本質(zhì)上封裝了list某種對(duì)象,我想知道我應(yīng)該如何實(shí)現(xiàn)它的__repr__功能。我很想選擇以下內(nèi)容:class MyCollection:   def __init__(self, objects = []):      self._objects = []      self._objects.extend(objects)   def __repr__(self):      return f"MyCollection({self._objects})"這具有生成完整描述類實(shí)例的有效 Python 輸出的優(yōu)點(diǎn)。然而,在我的真實(shí)情況下,對(duì)象列表可能相當(dāng)大,每個(gè)對(duì)象本身可能有一個(gè)很大的 repr(它們本身就是數(shù)組)。在這種情況下的最佳做法是什么?接受 repr 可能通常是一個(gè)很長的字符串?是否存在與此相關(guān)的潛在問題(調(diào)試器 UI 等)?我應(yīng)該使用分號(hào)實(shí)施某種縮短方案嗎?如果是這樣,是否有一種好的/標(biāo)準(zhǔn)的方法來實(shí)現(xiàn)這一目標(biāo)?或者我應(yīng)該完全跳過列出集合的內(nèi)容嗎?
查看完整描述

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)試,因此表示信息豐富且明確非常重要。

Python 3__repr__文檔

列表、字符串、集合、元組和字典都在它們的 __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])'


查看完整回答
反對(duì) 回復(fù) 2023-03-08
  • 1 回答
  • 0 關(guān)注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)