1
1
# SOME DESCRIPTIVE TITLE.
2
- # Copyright (C) 2001-2024 , Python Software Foundation
2
+ # Copyright (C) 2001-2025 , Python Software Foundation
3
3
# This file is distributed under the same license as the Python package.
4
4
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
5
#
11
11
# WH-2099 <wh2099@outlook.com>, 2021
12
12
# lian Wu (Wulian) <xiguawulian@gmail.com>, 2024
13
13
# Zhikang Yan <2951256653@qq.com>, 2024
14
- # Freesand Leo <yuqinju@163.com>, 2024
14
+ # Freesand Leo <yuqinju@163.com>, 2025
15
15
#
16
16
#, fuzzy
17
17
msgid ""
18
18
msgstr ""
19
19
"Project-Id-Version : Python 3.13\n "
20
20
"Report-Msgid-Bugs-To : \n "
21
- "POT-Creation-Date : 2024-12-20 14:16 +0000\n "
21
+ "POT-Creation-Date : 2025-01-10 14:17 +0000\n "
22
22
"PO-Revision-Date : 2021-06-28 00:53+0000\n "
23
- "Last-Translator : Freesand Leo <yuqinju@163.com>, 2024 \n "
23
+ "Last-Translator : Freesand Leo <yuqinju@163.com>, 2025 \n "
24
24
"Language-Team : Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n "
25
25
"MIME-Version : 1.0\n "
26
26
"Content-Type : text/plain; charset=UTF-8\n "
@@ -263,6 +263,9 @@ msgid ""
263
263
" parameter that lets the :meth:`~object.__get__` method learn the target "
264
264
"directory. The *objtype* parameter is the class *Directory*."
265
265
msgstr ""
266
+ "除了说明描述器如何运行计算,这个例子也揭示了传给 :meth:`~object.__get__` 的形参的目的。 *self* 形参为 "
267
+ "*size*,即一个 *DirectorySize* 的实例。 *obj* 形参为 *g* 或 *s*,即一个 *Directory* 的实例。 "
268
+ "*obj* 形参让 :meth:`~object.__get__` 方法获知目标目录。 *objtype* 形参为 *Directory* 类。"
266
269
267
270
#: ../../howto/descriptor.rst:131
268
271
msgid "Managed attributes"
@@ -276,6 +279,8 @@ msgid ""
276
279
" The descriptor's :meth:`~object.__get__` and :meth:`~object.__set__` "
277
280
"methods are triggered when the public attribute is accessed."
278
281
msgstr ""
282
+ "描述器的一种流行用法是管理对实例数据的访问。 描述器被分配给类字典中的公有属性,而实际数据则作为私有属性存储在实例字典中。 描述器的 "
283
+ ":meth:`~object.__get__` 和 :meth:`~object.__set__` 方法会在公有属性被访问时被触发。"
279
284
280
285
#: ../../howto/descriptor.rst:139
281
286
msgid ""
@@ -369,6 +374,28 @@ msgid ""
369
374
"INFO:root:Accessing 'age' giving 40\n"
370
375
"40"
371
376
msgstr ""
377
+ ">>> mary = Person('Mary M', 30) # 初始年龄更新会被记录\n"
378
+ "INFO:root:Updating 'age' to 30\n"
379
+ ">>> dave = Person('David D', 40)\n"
380
+ "INFO:root:Updating 'age' to 40\n"
381
+ "\n"
382
+ ">>> vars(mary) # 私有属性中的实际数据\n"
383
+ "{'name': 'Mary M', '_age': 30}\n"
384
+ ">>> vars(dave)\n"
385
+ "{'name': 'David D', '_age': 40}\n"
386
+ "\n"
387
+ ">>> mary.age # 访问数据并记录查找操作\n"
388
+ "INFO:root:Accessing 'age' giving 30\n"
389
+ "30\n"
390
+ ">>> mary.birthday() # 更新也会被记录\n"
391
+ "INFO:root:Accessing 'age' giving 30\n"
392
+ "INFO:root:Updating 'age' to 31\n"
393
+ "\n"
394
+ ">>> dave.name # 常规属性查找不会被记录\n"
395
+ "'David D'\n"
396
+ ">>> dave.age # 只有被管理的属性会被记录\n"
397
+ "INFO:root:Accessing 'age' giving 40\n"
398
+ "40"
372
399
373
400
#: ../../howto/descriptor.rst:206
374
401
msgid ""
@@ -398,6 +425,9 @@ msgid ""
398
425
" names can be recorded, giving each descriptor its own *public_name* and "
399
426
"*private_name*:"
400
427
msgstr ""
428
+ "在此示例中,:class:`!Person` 类具有两个描述器实例 *name* 和 *age*。 当 :class:`!Person` "
429
+ "类被定义时,它将在 *LoggedAccess* 中执行对 :meth:`~object.__set_name__` "
430
+ "的回调以便记录字段名称,给予每个描述器自己的 *public_name* 和 *private_name*:"
401
431
402
432
#: ../../howto/descriptor.rst:223
403
433
msgid ""
@@ -736,6 +766,57 @@ msgid ""
736
766
" f'Expected {self.predicate} to be true for {value!r}'\n"
737
767
" )"
738
768
msgstr ""
769
+ "class OneOf(Validator):\n"
770
+ "\n"
771
+ " def __init__(self, *options):\n"
772
+ " self.options = set(options)\n"
773
+ "\n"
774
+ " def validate(self, value):\n"
775
+ " if value not in self.options:\n"
776
+ " raise ValueError(\n"
777
+ " f'Expected {value!r} to be one of {self.options!r}'\n"
778
+ " )\n"
779
+ "\n"
780
+ "class Number(Validator):\n"
781
+ "\n"
782
+ " def __init__(self, minvalue=None, maxvalue=None):\n"
783
+ " self.minvalue = minvalue\n"
784
+ " self.maxvalue = maxvalue\n"
785
+ "\n"
786
+ " def validate(self, value):\n"
787
+ " if not isinstance(value, (int, float)):\n"
788
+ " raise TypeError(f'Expected {value!r} to be an int or float')\n"
789
+ " if self.minvalue is not None and value < self.minvalue:\n"
790
+ " raise ValueError(\n"
791
+ " f'Expected {value!r} to be at least {self.minvalue!r}'\n"
792
+ " )\n"
793
+ " if self.maxvalue is not None and value > self.maxvalue:\n"
794
+ " raise ValueError(\n"
795
+ " f'Expected {value!r} to be no more than {self.maxvalue!r}'\n"
796
+ " )\n"
797
+ "\n"
798
+ "class String(Validator):\n"
799
+ "\n"
800
+ " def __init__(self, minsize=None, maxsize=None, predicate=None):\n"
801
+ " self.minsize = minsize\n"
802
+ " self.maxsize = maxsize\n"
803
+ " self.predicate = predicate\n"
804
+ "\n"
805
+ " def validate(self, value):\n"
806
+ " if not isinstance(value, str):\n"
807
+ " raise TypeError(f'Expected {value!r} to be an str')\n"
808
+ " if self.minsize is not None and len(value) < self.minsize:\n"
809
+ " raise ValueError(\n"
810
+ " f'Expected {value!r} to be no smaller than {self.minsize!r}'\n"
811
+ " )\n"
812
+ " if self.maxsize is not None and len(value) > self.maxsize:\n"
813
+ " raise ValueError(\n"
814
+ " f'Expected {value!r} to be no bigger than {self.maxsize!r}'\n"
815
+ " )\n"
816
+ " if self.predicate is not None and not self.predicate(value):\n"
817
+ " raise ValueError(\n"
818
+ " f'Expected {self.predicate} to be true for {value!r}'\n"
819
+ " )"
739
820
740
821
#: ../../howto/descriptor.rst:439
741
822
msgid "Practical application"
0 commit comments