Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit58f99a2

Browse files
Copilotmattwang44
andcommitted
Fix line breaks and translate Complete Practical Example section
Co-authored-by: mattwang44 <24987826+mattwang44@users.noreply.github.com>
1 parent747a9e4 commit58f99a2

File tree

1 file changed

+143
-7
lines changed

1 file changed

+143
-7
lines changed

‎howto/descriptor.po

Lines changed: 143 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ msgid ""
129129
" x = 5 # Regular class attribute\n"
130130
" y = Ten() # Descriptor instance"
131131
msgstr""
132+
"class A:\n"
133+
" x = 5 # 一般類別屬性\n"
134+
" y = Ten() # 描述器實例"
132135

133136
#:../../howto/descriptor.rst:62
134137
msgid""
@@ -145,6 +148,11 @@ msgid ""
145148
">>> a.y # Descriptor lookup\n"
146149
"10"
147150
msgstr""
151+
">>> a = A() # 建立類別 A 的實例\n"
152+
">>> a.x # 一般屬性查找\n"
153+
"5\n"
154+
">>> a.y # 描述器查找\n"
155+
"10"
148156

149157
#:../../howto/descriptor.rst:73
150158
msgid""
@@ -202,6 +210,19 @@ msgid ""
202210
" def __init__(self, dirname):\n"
203211
" self.dirname = dirname # Regular instance attribute"
204212
msgstr""
213+
"import os\n"
214+
"\n"
215+
"class DirectorySize:\n"
216+
"\n"
217+
" def __get__(self, obj, objtype=None):\n"
218+
" return len(os.listdir(obj.dirname))\n"
219+
"\n"
220+
"class Directory:\n"
221+
"\n"
222+
" size = DirectorySize() # 描述器實例\n"
223+
"\n"
224+
" def __init__(self, dirname):\n"
225+
" self.dirname = dirname # 一般實例屬性"
205226

206227
#:../../howto/descriptor.rst:109
207228
msgid""
@@ -225,6 +246,15 @@ msgid ""
225246
"updated\n"
226247
"2"
227248
msgstr""
249+
">>> s = Directory('songs')\n"
250+
">>> g = Directory('games')\n"
251+
">>> s.size # songs 目錄有二十個檔案\n"
252+
"20\n"
253+
">>> g.size # games 目錄有三個檔案\n"
254+
"3\n"
255+
">>> os.remove('games/chess') # 刪除一個遊戲\n"
256+
">>> g.size # 檔案數量自動更新\n"
257+
"2"
228258

229259
#:../../howto/descriptor.rst:122
230260
msgid""
@@ -288,6 +318,31 @@ msgid ""
288318
" def birthday(self):\n"
289319
" self.age += 1 # Calls both __get__() and __set__()"
290320
msgstr""
321+
"import logging\n"
322+
"\n"
323+
"logging.basicConfig(level=logging.INFO)\n"
324+
"\n"
325+
"class LoggedAgeAccess:\n"
326+
"\n"
327+
" def __get__(self, obj, objtype=None):\n"
328+
" value = obj._age\n"
329+
" logging.info('Accessing %r giving %r', 'age', value)\n"
330+
" return value\n"
331+
"\n"
332+
" def __set__(self, obj, value):\n"
333+
" logging.info('Updating %r to %r', 'age', value)\n"
334+
" obj._age = value\n"
335+
"\n"
336+
"class Person:\n"
337+
"\n"
338+
" age = LoggedAgeAccess() # 描述器實例\n"
339+
"\n"
340+
" def __init__(self, name, age):\n"
341+
" self.name = name # 一般實例屬性\n"
342+
" self.age = age # 呼叫 __set__()\n"
343+
"\n"
344+
" def birthday(self):\n"
345+
" self.age += 1 # 同時呼叫 __get__() 和 __set__()"
291346

292347
#:../../howto/descriptor.rst:172
293348
msgid""
@@ -325,6 +380,28 @@ msgid ""
325380
"INFO:root:Accessing 'age' giving 40\n"
326381
"40"
327382
msgstr""
383+
">>> mary = Person('Mary M', 30) # 初始的 age 更新被記錄\n"
384+
"INFO:root:Updating 'age' to 30\n"
385+
">>> dave = Person('David D', 40)\n"
386+
"INFO:root:Updating 'age' to 40\n"
387+
"\n"
388+
">>> vars(mary) # 實際資料在私有屬性中\n"
389+
"{'name': 'Mary M', '_age': 30}\n"
390+
">>> vars(dave)\n"
391+
"{'name': 'David D', '_age': 40}\n"
392+
"\n"
393+
">>> mary.age # 存取資料並記錄查找\n"
394+
"INFO:root:Accessing 'age' giving 30\n"
395+
"30\n"
396+
">>> mary.birthday() # 更新也會被記錄\n"
397+
"INFO:root:Accessing 'age' giving 30\n"
398+
"INFO:root:Updating 'age' to 31\n"
399+
"\n"
400+
">>> dave.name # 一般屬性查找不會被記錄\n"
401+
"'David D'\n"
402+
">>> dave.age # 只有受管理的屬性會被記錄\n"
403+
"INFO:root:Accessing 'age' giving 40\n"
404+
"40"
328405

329406
#:../../howto/descriptor.rst:206
330407
msgid""
@@ -389,6 +466,36 @@ msgid ""
389466
" def birthday(self):\n"
390467
" self.age += 1"
391468
msgstr""
469+
"import logging\n"
470+
"\n"
471+
"logging.basicConfig(level=logging.INFO)\n"
472+
"\n"
473+
"class LoggedAccess:\n"
474+
"\n"
475+
" def __set_name__(self, owner, name):\n"
476+
" self.public_name = name\n"
477+
" self.private_name = '_' + name\n"
478+
"\n"
479+
" def __get__(self, obj, objtype=None):\n"
480+
" value = getattr(obj, self.private_name)\n"
481+
" logging.info('Accessing %r giving %r', self.public_name, value)\n"
482+
" return value\n"
483+
"\n"
484+
" def __set__(self, obj, value):\n"
485+
" logging.info('Updating %r to %r', self.public_name, value)\n"
486+
" setattr(obj, self.private_name, value)\n"
487+
"\n"
488+
"class Person:\n"
489+
"\n"
490+
" name = LoggedAccess() # 第一個描述器實例\n"
491+
" age = LoggedAccess() # 第二個描述器實例\n"
492+
"\n"
493+
" def __init__(self, name, age):\n"
494+
" self.name = name # 呼叫第一個描述器\n"
495+
" self.age = age # 呼叫第二個描述器\n"
496+
"\n"
497+
" def birthday(self):\n"
498+
" self.age += 1"
392499

393500
#:../../howto/descriptor.rst:256
394501
msgid""
@@ -508,17 +615,18 @@ msgstr ""
508615

509616
#:../../howto/descriptor.rst:326
510617
msgid"Complete Practical Example"
511-
msgstr""
618+
msgstr"完整實用範例"
512619

513620
#:../../howto/descriptor.rst:328
514621
msgid""
515622
"In this example, we create a practical and powerful tool for locating "
516623
"notoriously hard to find data corruption bugs."
517624
msgstr""
625+
"在這個範例中,我們建立一個實用且強大的工具,用於找出惡名昭彰且難以發現的資料損壞錯誤。"
518626

519627
#:../../howto/descriptor.rst:333
520628
msgid"Validator class"
521-
msgstr""
629+
msgstr"驗證器類別"
522630

523631
#:../../howto/descriptor.rst:335
524632
msgid""
@@ -527,12 +635,14 @@ msgid ""
527635
"restrictions. If those restrictions aren't met, it raises an exception to "
528636
"prevent data corruption at its source."
529637
msgstr""
638+
"驗證器是用於受管理屬性存取的描述器。在儲存任何資料之前,它會驗證新數值是否符合各種型別和範圍限制。如果不符合這些限制,它會引發例外以防止資料在源頭被損壞。"
530639

531640
#:../../howto/descriptor.rst:340
532641
msgid""
533642
"This :class:`!Validator` class is both an :term:`abstract base class` and a "
534643
"managed attribute descriptor:"
535644
msgstr""
645+
"這個 :class:`!Validator` 類別既是 :term:`抽象基底類別 <abstract base class>` 也是受管理屬性描述器:"
536646

537647
#:../../howto/descriptor.rst:343
538648
msgid""
@@ -577,26 +687,29 @@ msgid ""
577687
"Custom validators need to inherit from :class:`!Validator` and must supply "
578688
"a :meth:`!validate` method to test various restrictions as needed."
579689
msgstr""
690+
"自訂驗證器需要繼承自 :class:`!Validator` 並且必須提供 :meth:`!validate` 方法來依需要測試各種限制。"
580691

581692
#:../../howto/descriptor.rst:368
582693
msgid"Custom validators"
583-
msgstr""
694+
msgstr"自訂驗證器"
584695

585696
#:../../howto/descriptor.rst:370
586697
msgid"Here are three practical data validation utilities:"
587-
msgstr""
698+
msgstr"以下是三個實用的資料驗證工具:"
588699

589700
#:../../howto/descriptor.rst:372
590701
msgid""
591702
":class:`!OneOf` verifies that a value is one of a restricted set of options."
592703
msgstr""
704+
":class:`!OneOf` 驗證數值是否為限制選項集合中的其中一個。"
593705

594706
#:../../howto/descriptor.rst:374
595707
msgid""
596708
":class:`!Number` verifies that a value is either an :class:`int` "
597709
"or :class:`float`. Optionally, it verifies that a value is between a given "
598710
"minimum or maximum."
599711
msgstr""
712+
":class:`!Number` 驗證數值是否為 :class:`int` 或 :class:`float`。可選地,它會驗證數值是否在給定的最小值或最大值之間。"
600713

601714
#:../../howto/descriptor.rst:378
602715
msgid""
@@ -605,6 +718,7 @@ msgid ""
605718
"`predicate <https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)>`_ "
606719
"as well."
607720
msgstr""
721+
":class:`!String` 驗證數值是否為 :class:`str`。可選地,它會驗證給定的最小或最大長度。它還可以驗證使用者定義的 `述詞 <https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)>`_。"
608722

609723
#:../../howto/descriptor.rst:383
610724
msgid""
@@ -664,11 +778,11 @@ msgstr ""
664778

665779
#:../../howto/descriptor.rst:439
666780
msgid"Practical application"
667-
msgstr""
781+
msgstr"實際應用"
668782

669783
#:../../howto/descriptor.rst:441
670784
msgid"Here's how the data validators can be used in a real class:"
671-
msgstr""
785+
msgstr"以下展示如何在真實類別中使用資料驗證器:"
672786

673787
#:../../howto/descriptor.rst:443
674788
msgid""
@@ -686,7 +800,7 @@ msgstr ""
686800

687801
#:../../howto/descriptor.rst:456
688802
msgid"The descriptors prevent invalid instances from being created:"
689-
msgstr""
803+
msgstr"描述器防止建立無效的實例:"
690804

691805
#:../../howto/descriptor.rst:458
692806
msgid""
@@ -714,6 +828,28 @@ msgid ""
714828
"\n"
715829
">>> c = Component('WIDGET', 'metal', 5) # Allowed: The inputs are valid"
716830
msgstr""
831+
">>> Component('Widget', 'metal', 5) # 被阻止:'Widget' 不是全大寫\n"
832+
"Traceback (most recent call last):\n"
833+
" ...\n"
834+
"ValueError: Expected <method 'isupper' of 'str' objects> to be true for "
835+
"'Widget'\n"
836+
"\n"
837+
">>> Component('WIDGET', 'metle', 5) # 被阻止:'metle' 拼寫錯誤\n"
838+
"Traceback (most recent call last):\n"
839+
" ...\n"
840+
"ValueError: Expected 'metle' to be one of {'metal', 'plastic', 'wood'}\n"
841+
"\n"
842+
">>> Component('WIDGET', 'metal', -5) # 被阻止:-5 是負數\n"
843+
"Traceback (most recent call last):\n"
844+
" ...\n"
845+
"ValueError: Expected -5 to be at least 0\n"
846+
"\n"
847+
">>> Component('WIDGET', 'metal', 'V') # 被阻止:'V' 不是數字\n"
848+
"Traceback (most recent call last):\n"
849+
" ...\n"
850+
"TypeError: Expected 'V' to be an int or float\n"
851+
"\n"
852+
">>> c = Component('WIDGET', 'metal', 5) # 允許:輸入有效"
717853

718854
#:../../howto/descriptor.rst:484
719855
msgid"Technical Tutorial"

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp