@@ -1287,6 +1287,9 @@ msgstr ""
12871287"果該物件沒有實作此方法,則本值必須是一個字典,且其將會被新增到物件的 :attr:"
12881288"`~object.__dict__` 屬性中。"
12891289
1290+ # SkyLull: [T]
1291+ # signature: https://stackoverflow.com/questions/72788932/what-is-a-function-
1292+ # signature -> 輸入特徵
12901293#: ../../library/pickle.rst:707
12911294msgid ""
12921295"Optionally, an iterator (and not a sequence) yielding successive items. "
@@ -1301,9 +1304,9 @@ msgstr ""
13011304"可選項。一個用來提供連續項目的疊代器(而非序列)。這些項目將個別透過 ``obj."
13021305"append(item)`` 方法或成批次地透過 ``obj.extend(list_of_items)`` 方法被附加到"
13031306"物件中。主要用於串列(list)子類別,但只要其他類別具有相應的 :ref:`append 和 "
1304- "extend 方法 <typesseq-common>`就也可以使用。 (如何選擇使用 :meth:`!append` "
1305- "或 :meth:`!extend` 方法將取決於所選用的 pickle 協定版本以及要附加的項目數量, "
1306- "因此必須同時支援這兩種方法。)"
1307+ "extend 方法 <typesseq-common>`和相同的輸入特徵(signature) 就也可以使用。 "
1308+ "(如何選擇使用 :meth:`!append` 或 :meth:`!extend` 方法將取決於所選用的 "
1309+ "pickle 協定版本以及要附加的項目數量, 因此必須同時支援這兩種方法。)"
13071310
13081311#: ../../library/pickle.rst:717
13091312msgid ""
@@ -1324,10 +1327,14 @@ msgid ""
13241327"method. If not ``None``, this callable will have priority over ``obj``'s :"
13251328"meth:`__setstate__`."
13261329msgstr ""
1330+ "可選項。一個具有 ``(obj, state)`` 輸入特徵(signature)的可呼叫物件。該物件允"
1331+ "許使用者以可編寫的邏輯,而不是物件 ``obj`` 預設的 :meth:`__setstate__` 靜態方"
1332+ "法去控制特定物件的狀態更新方式。如果這個物件不是 ``None``,這個物件的呼叫優先"
1333+ "權將優於物件 ``obj`` 的 :meth:`__setstate__`。"
13271334
13281335#: ../../library/pickle.rst:728
13291336msgid "The optional sixth tuple item, ``(obj, state)``, was added."
1330- msgstr ""
1337+ msgstr "加入第六個可選項(一個 ``(obj, state)`` 元組)。 "
13311338
13321339#: ../../library/pickle.rst:734
13331340msgid ""
@@ -1338,10 +1345,14 @@ msgid ""
13381345"a synonym for the extended version. The main use for this method is to "
13391346"provide backwards-compatible reduce values for older Python releases."
13401347msgstr ""
1348+ "另外,你也可以定義一個 :meth:`__reduce_ex__` 方法。唯一的不同的地方是此方法只"
1349+ "接受協定版本(整數)作為參數。當有定義本方法時,pickle 會優先調用它而不是 :"
1350+ "meth:`__reduce__` 。此外,呼叫 :meth:`__reduce__` 時也會自動變成呼叫這個變體"
1351+ "版本。此方法主要是為了向後相容的舊的 Python 版本而存在。"
13411352
13421353#: ../../library/pickle.rst:746
13431354msgid "Persistence of External Objects"
1344- msgstr ""
1355+ msgstr "外部物件持久化 "
13451356
13461357#: ../../library/pickle.rst:752
13471358msgid ""
@@ -1351,6 +1362,10 @@ msgid ""
13511362"of alphanumeric characters (for protocol 0) [#]_ or just an arbitrary object "
13521363"(for any newer protocol)."
13531364msgstr ""
1365+ "為了方便物件持久化,:mod:`pickle` 模組支援對被封裝資料串流以外的物件參照。被"
1366+ "參照的物件是透過一個持久化 ID 來參照的,這個 ID 應該要是字母數字字元"
1367+ "(alphanumeric)組成的字串(協定 0) [#]_ 或者是任意的物件(任何較新的協"
1368+ "定)。"
13541369
13551370#: ../../library/pickle.rst:758
13561371msgid ""
@@ -1359,6 +1374,9 @@ msgid ""
13591374"pickler and unpickler, :meth:`~Pickler.persistent_id` and :meth:`~Unpickler."
13601375"persistent_load` respectively."
13611376msgstr ""
1377+ ":mod:`pickle` 沒有定義要如何解決或分派這個持久化 ID 的問題;故其處理方式有賴"
1378+ "使用者自行定義在封裝器(pickler)以及拆封器(unpickler)中。方法的名稱各自"
1379+ "為 :meth:`~Pickler.persistent_id` 和 :meth:`~Unpickler.persistent_load`。"
13621380
13631381#: ../../library/pickle.rst:763
13641382msgid ""
@@ -1370,19 +1388,27 @@ msgid ""
13701388"object, along with a marker so that the unpickler will recognize it as a "
13711389"persistent ID."
13721390msgstr ""
1391+ "要封裝具有外部持久化 ID 的物件,封裝器(pickler)必須擁有一個自訂的方法 :"
1392+ "meth:`~Pickler.persistent_id`,這個方法將接收一個物件作為參數,並回傳 `None` "
1393+ "或該物件的持久化 ID。當回傳 `None` 時,封裝器會正常地封裝該物件。當回傳一個持"
1394+ "久化 ID 字串時,封裝器會封裝該物件並加上一個標記,讓拆封器(unpikler)能識別"
1395+ "它是一個持久化 ID。"
13731396
13741397#: ../../library/pickle.rst:770
13751398msgid ""
13761399"To unpickle external objects, the unpickler must have a custom :meth:"
13771400"`~Unpickler.persistent_load` method that takes a persistent ID object and "
13781401"returns the referenced object."
13791402msgstr ""
1403+ "要拆封外部物件,拆封器(unpickler)必須有一個自訂的 :meth:`~Unpickler."
1404+ "persistent_load` 方法,該方法應接受一個持久化 ID 物件,並回傳相對應的物件。"
13801405
13811406#: ../../library/pickle.rst:774
13821407msgid ""
13831408"Here is a comprehensive example presenting how persistent ID can be used to "
13841409"pickle external objects by reference."
13851410msgstr ""
1411+ "以下是一個完整的範例,用以說明如何使用持久化 ID 來封裝具外部參照的物件。"
13861412
13871413#: ../../library/pickle.rst:777
13881414msgid ""
@@ -1481,10 +1507,96 @@ msgid ""
14811507"if __name__ == '__main__':\n"
14821508" main()\n"
14831509msgstr ""
1510+ "# 展示如何使用持久化 ID 來封裝外部物件的簡單範例\n"
1511+ "\n"
1512+ "import pickle\n"
1513+ "import sqlite3\n"
1514+ "from collections import namedtuple\n"
1515+ "\n"
1516+ "# 代表資料庫中紀錄的一個簡易類別\n"
1517+ "MemoRecord = namedtuple(\" MemoRecord\" , \" key, task\" )\n"
1518+ "\n"
1519+ "class DBPickler(pickle.Pickler):\n"
1520+ "\n"
1521+ " def persistent_id(self, obj):\n"
1522+ " # 我們派發出一個持久 ID,而不是像一般類別實例那樣封裝 MemoRecord。\n"
1523+ " if isinstance(obj, MemoRecord):\n"
1524+ " # 我們的持久 ID 就是一個元組,裡面包含一個標籤和一個鍵,指向資料"
1525+ "庫中的特定紀錄。\n"
1526+ " return (\" MemoRecord\" , obj.key)\n"
1527+ " else:\n"
1528+ " # 如果 obj 沒有持久 ID,則返回 None。這表示 obj 像平常那樣封裝即"
1529+ "可。\n"
1530+ " return None\n"
1531+ "\n"
1532+ "\n"
1533+ "class DBUnpickler(pickle.Unpickler):\n"
1534+ "\n"
1535+ " def __init__(self, file, connection):\n"
1536+ " super().__init__(file)\n"
1537+ " self.connection = connection\n"
1538+ "\n"
1539+ " def persistent_load(self, pid):\n"
1540+ " # 每當遇到持久 ID 時,此方法都會被呼叫。\n"
1541+ " # pid 是 DBPickler 所回傳的元組。\n"
1542+ " cursor = self.connection.cursor()\n"
1543+ " type_tag, key_id = pid\n"
1544+ " if type_tag == \" MemoRecord\" :\n"
1545+ " # 從資料庫中抓取所引用的紀錄並返回。\n"
1546+ " cursor.execute(\" SELECT * FROM memos WHERE key=?\" , "
1547+ "(str(key_id),))\n"
1548+ " key, task = cursor.fetchone()\n"
1549+ " return MemoRecord(key, task)\n"
1550+ " else:\n"
1551+ " # 如果無法返回正確的物件,則必須拋出錯誤。\n"
1552+ " # 否則 unpickler 會誤認為 None 是持久 ID 所引用的物件。\n"
1553+ " raise pickle.UnpicklingError(\" unsupported persistent object\" )\n"
1554+ "\n"
1555+ "\n"
1556+ "def main():\n"
1557+ " import io\n"
1558+ " import pprint\n"
1559+ "\n"
1560+ " # 初始化資料庫。\n"
1561+ " conn = sqlite3.connect(\" :memory:\" )\n"
1562+ " cursor = conn.cursor()\n"
1563+ " cursor.execute(\" CREATE TABLE memos(key INTEGER PRIMARY KEY, task "
1564+ "TEXT)\" )\n"
1565+ " tasks = (\n"
1566+ " 'give food to fish',\n"
1567+ " 'prepare group meeting',\n"
1568+ " 'fight with a zebra',\n"
1569+ " )\n"
1570+ " for task in tasks:\n"
1571+ " cursor.execute(\" INSERT INTO memos VALUES(NULL, ?)\" , (task,))\n"
1572+ "\n"
1573+ " # 抓取要封裝的紀錄。\n"
1574+ " cursor.execute(\" SELECT * FROM memos\" )\n"
1575+ " memos = [MemoRecord(key, task) for key, task in cursor]\n"
1576+ " # 使用我們自訂的 DBPickler 來保存紀錄。\n"
1577+ " file = io.BytesIO()\n"
1578+ " DBPickler(file).dump(memos)\n"
1579+ "\n"
1580+ " print(\" 被封裝的紀錄:\" )\n"
1581+ " pprint.pprint(memos)\n"
1582+ "\n"
1583+ " # 更新一筆紀錄(測試用)。\n"
1584+ " cursor.execute(\" UPDATE memos SET task='learn italian' WHERE key=1\" )\n"
1585+ "\n"
1586+ " # 從 pickle 資料流中載入紀錄。\n"
1587+ " file.seek(0)\n"
1588+ " memos = DBUnpickler(file, conn).load()\n"
1589+ "\n"
1590+ " print(\" 已拆封的紀錄:\" )\n"
1591+ " pprint.pprint(memos)\n"
1592+ "\n"
1593+ "\n"
1594+ "if __name__ == '__main__':\n"
1595+ " main()\n"
14841596
14851597#: ../../library/pickle.rst:782
14861598msgid "Dispatch Tables"
1487- msgstr ""
1599+ msgstr "分派表 "
14881600
14891601#: ../../library/pickle.rst:784
14901602msgid ""
0 commit comments