@@ -1287,6 +1287,9 @@ msgstr ""
1287
1287
"果該物件沒有實作此方法,則本值必須是一個字典,且其將會被新增到物件的 :attr:"
1288
1288
"`~object.__dict__` 屬性中。"
1289
1289
1290
+ # SkyLull: [T]
1291
+ # signature: https://stackoverflow.com/questions/72788932/what-is-a-function-
1292
+ # signature -> 輸入特徵
1290
1293
#: ../../library/pickle.rst:707
1291
1294
msgid ""
1292
1295
"Optionally, an iterator (and not a sequence) yielding successive items. "
@@ -1301,9 +1304,9 @@ msgstr ""
1301
1304
"可選項。一個用來提供連續項目的疊代器(而非序列)。這些項目將個別透過 ``obj."
1302
1305
"append(item)`` 方法或成批次地透過 ``obj.extend(list_of_items)`` 方法被附加到"
1303
1306
"物件中。主要用於串列(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 協定版本以及要附加的項目數量, 因此必須同時支援這兩種方法。)"
1307
1310
1308
1311
#: ../../library/pickle.rst:717
1309
1312
msgid ""
@@ -1324,10 +1327,14 @@ msgid ""
1324
1327
"method. If not ``None``, this callable will have priority over ``obj``'s :"
1325
1328
"meth:`__setstate__`."
1326
1329
msgstr ""
1330
+ "可選項。一個具有 ``(obj, state)`` 輸入特徵(signature)的可呼叫物件。該物件允"
1331
+ "許使用者以可編寫的邏輯,而不是物件 ``obj`` 預設的 :meth:`__setstate__` 靜態方"
1332
+ "法去控制特定物件的狀態更新方式。如果這個物件不是 ``None``,這個物件的呼叫優先"
1333
+ "權將優於物件 ``obj`` 的 :meth:`__setstate__`。"
1327
1334
1328
1335
#: ../../library/pickle.rst:728
1329
1336
msgid "The optional sixth tuple item, ``(obj, state)``, was added."
1330
- msgstr ""
1337
+ msgstr "加入第六個可選項(一個 ``(obj, state)`` 元組)。 "
1331
1338
1332
1339
#: ../../library/pickle.rst:734
1333
1340
msgid ""
@@ -1338,10 +1345,14 @@ msgid ""
1338
1345
"a synonym for the extended version. The main use for this method is to "
1339
1346
"provide backwards-compatible reduce values for older Python releases."
1340
1347
msgstr ""
1348
+ "另外,你也可以定義一個 :meth:`__reduce_ex__` 方法。唯一的不同的地方是此方法只"
1349
+ "接受協定版本(整數)作為參數。當有定義本方法時,pickle 會優先調用它而不是 :"
1350
+ "meth:`__reduce__` 。此外,呼叫 :meth:`__reduce__` 時也會自動變成呼叫這個變體"
1351
+ "版本。此方法主要是為了向後相容的舊的 Python 版本而存在。"
1341
1352
1342
1353
#: ../../library/pickle.rst:746
1343
1354
msgid "Persistence of External Objects"
1344
- msgstr ""
1355
+ msgstr "外部物件持久化 "
1345
1356
1346
1357
#: ../../library/pickle.rst:752
1347
1358
msgid ""
@@ -1351,6 +1362,10 @@ msgid ""
1351
1362
"of alphanumeric characters (for protocol 0) [#]_ or just an arbitrary object "
1352
1363
"(for any newer protocol)."
1353
1364
msgstr ""
1365
+ "為了方便物件持久化,:mod:`pickle` 模組支援對被封裝資料串流以外的物件參照。被"
1366
+ "參照的物件是透過一個持久化 ID 來參照的,這個 ID 應該要是字母數字字元"
1367
+ "(alphanumeric)組成的字串(協定 0) [#]_ 或者是任意的物件(任何較新的協"
1368
+ "定)。"
1354
1369
1355
1370
#: ../../library/pickle.rst:758
1356
1371
msgid ""
@@ -1359,6 +1374,9 @@ msgid ""
1359
1374
"pickler and unpickler, :meth:`~Pickler.persistent_id` and :meth:`~Unpickler."
1360
1375
"persistent_load` respectively."
1361
1376
msgstr ""
1377
+ ":mod:`pickle` 沒有定義要如何解決或分派這個持久化 ID 的問題;故其處理方式有賴"
1378
+ "使用者自行定義在封裝器(pickler)以及拆封器(unpickler)中。方法的名稱各自"
1379
+ "為 :meth:`~Pickler.persistent_id` 和 :meth:`~Unpickler.persistent_load`。"
1362
1380
1363
1381
#: ../../library/pickle.rst:763
1364
1382
msgid ""
@@ -1370,19 +1388,27 @@ msgid ""
1370
1388
"object, along with a marker so that the unpickler will recognize it as a "
1371
1389
"persistent ID."
1372
1390
msgstr ""
1391
+ "要封裝具有外部持久化 ID 的物件,封裝器(pickler)必須擁有一個自訂的方法 :"
1392
+ "meth:`~Pickler.persistent_id`,這個方法將接收一個物件作為參數,並回傳 `None` "
1393
+ "或該物件的持久化 ID。當回傳 `None` 時,封裝器會正常地封裝該物件。當回傳一個持"
1394
+ "久化 ID 字串時,封裝器會封裝該物件並加上一個標記,讓拆封器(unpikler)能識別"
1395
+ "它是一個持久化 ID。"
1373
1396
1374
1397
#: ../../library/pickle.rst:770
1375
1398
msgid ""
1376
1399
"To unpickle external objects, the unpickler must have a custom :meth:"
1377
1400
"`~Unpickler.persistent_load` method that takes a persistent ID object and "
1378
1401
"returns the referenced object."
1379
1402
msgstr ""
1403
+ "要拆封外部物件,拆封器(unpickler)必須有一個自訂的 :meth:`~Unpickler."
1404
+ "persistent_load` 方法,該方法應接受一個持久化 ID 物件,並回傳相對應的物件。"
1380
1405
1381
1406
#: ../../library/pickle.rst:774
1382
1407
msgid ""
1383
1408
"Here is a comprehensive example presenting how persistent ID can be used to "
1384
1409
"pickle external objects by reference."
1385
1410
msgstr ""
1411
+ "以下是一個完整的範例,用以說明如何使用持久化 ID 來封裝具外部參照的物件。"
1386
1412
1387
1413
#: ../../library/pickle.rst:777
1388
1414
msgid ""
@@ -1481,10 +1507,96 @@ msgid ""
1481
1507
"if __name__ == '__main__':\n"
1482
1508
" main()\n"
1483
1509
msgstr ""
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"
1484
1596
1485
1597
#: ../../library/pickle.rst:782
1486
1598
msgid "Dispatch Tables"
1487
- msgstr ""
1599
+ msgstr "分派表 "
1488
1600
1489
1601
#: ../../library/pickle.rst:784
1490
1602
msgid ""
0 commit comments