@@ -18,7 +18,7 @@ msgid ""
18
18
msgstr ""
19
19
"Project-Id-Version :Python 3.14\n "
20
20
"Report-Msgid-Bugs-To :\n "
21
- "POT-Creation-Date :2025-05-08 02:53-0300 \n "
21
+ "POT-Creation-Date :2025-05-16 14:19+0000 \n "
22
22
"PO-Revision-Date :2021-06-28 00:52+0000\n "
23
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 "
@@ -143,6 +143,101 @@ msgid ""
143
143
" uint16_t tp_versions_used;\n"
144
144
"} PyTypeObject;\n"
145
145
msgstr ""
146
+ "typedef struct _typeobject {\n"
147
+ " PyObject_VAR_HEAD\n"
148
+ " const char *tp_name; /* 用于打印,格式为\" <module>.<name>\" */\n"
149
+ " Py_ssize_t tp_basicsize, tp_itemsize; /* 用于分配 */\n"
150
+ "\n"
151
+ " /* 用于实现标准操作的方法 */\n"
152
+ "\n"
153
+ " destructor tp_dealloc;\n"
154
+ " Py_ssize_t tp_vectorcall_offset;\n"
155
+ " getattrfunc tp_getattr;\n"
156
+ " setattrfunc tp_setattr;\n"
157
+ " PyAsyncMethods *tp_as_async; /* 原名为 tp_compare (Python 2)\n"
158
+ " 或 tp_reserved (Python 3) */\n"
159
+ " reprfunc tp_repr;\n"
160
+ "\n"
161
+ " /* 用于标准类的方法集 */\n"
162
+ "\n"
163
+ " PyNumberMethods *tp_as_number;\n"
164
+ " PySequenceMethods *tp_as_sequence;\n"
165
+ " PyMappingMethods *tp_as_mapping;\n"
166
+ "\n"
167
+ " /* 更多标准操作 (这些用于二进制兼容) */\n"
168
+ "\n"
169
+ " hashfunc tp_hash;\n"
170
+ " ternaryfunc tp_call;\n"
171
+ " reprfunc tp_str;\n"
172
+ " getattrofunc tp_getattro;\n"
173
+ " setattrofunc tp_setattro;\n"
174
+ "\n"
175
+ " /* 用于以输入/输出缓冲区方式访问对象的函数 */\n"
176
+ " PyBufferProcs *tp_as_buffer;\n"
177
+ "\n"
178
+ " /* 用于定义可选/扩展特性是否存在的旗标 */\n"
179
+ " unsigned long tp_flags;\n"
180
+ "\n"
181
+ " const char *tp_doc; /* 文档字符串 */\n"
182
+ "\n"
183
+ " /* 在 2.0 发布版中分配的含义 */\n"
184
+ " /* 为所有可访问的对象调用函数 */\n"
185
+ " traverseproc tp_traverse;\n"
186
+ "\n"
187
+ " /* 删除对所包含对象的引用 */\n"
188
+ " inquiry tp_clear;\n"
189
+ "\n"
190
+ " /* 在 2.1 发布版中分配的含义 */\n"
191
+ " /* 富比较操作 */\n"
192
+ " richcmpfunc tp_richcompare;\n"
193
+ "\n"
194
+ " /* 启用弱引用 */\n"
195
+ " Py_ssize_t tp_weaklistoffset;\n"
196
+ "\n"
197
+ " /* 迭代器 */\n"
198
+ " getiterfunc tp_iter;\n"
199
+ " iternextfunc tp_iternext;\n"
200
+ "\n"
201
+ " /* 属性描述器和子类化内容 */\n"
202
+ " PyMethodDef *tp_methods;\n"
203
+ " PyMemberDef *tp_members;\n"
204
+ " PyGetSetDef *tp_getset;\n"
205
+ " // 堆类型的强引用,静态类型的借入引用\n"
206
+ " PyTypeObject *tp_base;\n"
207
+ " PyObject *tp_dict;\n"
208
+ " descrgetfunc tp_descr_get;\n"
209
+ " descrsetfunc tp_descr_set;\n"
210
+ " Py_ssize_t tp_dictoffset;\n"
211
+ " initproc tp_init;\n"
212
+ " allocfunc tp_alloc;\n"
213
+ " newfunc tp_new;\n"
214
+ " freefunc tp_free; /* 层级的释放内存例程 */\n"
215
+ " inquiry tp_is_gc; /* 用于 PyObject_IS_GC */\n"
216
+ " PyObject *tp_bases;\n"
217
+ " PyObject *tp_mro; /* 方法解析顺序 */\n"
218
+ " PyObject *tp_cache; /* 不再被使用 */\n"
219
+ " void *tp_subclasses; /* 对于静态内置类型这将是一个索引 */\n"
220
+ " PyObject *tp_weaklist; /* 不被用于静态内置类型 */\n"
221
+ " destructor tp_del;\n"
222
+ "\n"
223
+ " /* 类型属性缓存版本标签。 在 2.6 版中添加。\n"
224
+ " * 如果为零,则缓存无效并且必须被初始化。\n"
225
+ " */\n"
226
+ " unsigned int tp_version_tag;\n"
227
+ "\n"
228
+ " destructor tp_finalize;\n"
229
+ " vectorcallfunc tp_vectorcall;\n"
230
+ "\n"
231
+ " /* 类型监视器针对此类型的位设置 */\n"
232
+ " unsigned char tp_watched;\n"
233
+ "\n"
234
+ " /* 使用的 tp_version_tag 值数量。\n"
235
+ " * 如果针对此类型的属性缓存被禁用则设为 _Py_ATTR_CACHE_UNUSED\n"
236
+ " * (例如由于自定义的 MRO 条目而被禁用)。\n"
237
+ " * 在其他情况下,将被限制为 MAX_VERSIONS_PER_CLASS (在其他地方定义)。\n"
238
+ " */\n"
239
+ " uint16_t tp_versions_used;\n"
240
+ "} PyTypeObject;\n"
146
241
147
242
#: ../../extending/newtypes.rst:20
148
243
msgid ""
@@ -233,6 +328,13 @@ msgid ""
233
328
" Py_TYPE(self)->tp_free(self);\n"
234
329
"}"
235
330
msgstr ""
331
+ "static void\n"
332
+ "newdatatype_dealloc(PyObject *op)\n"
333
+ "{\n"
334
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
335
+ " free(self->obj_UnderlyingDatatypePtr);\n"
336
+ " Py_TYPE(self)->tp_free(self);\n"
337
+ "}"
236
338
237
339
#: ../../extending/newtypes.rst:80
238
340
msgid ""
@@ -252,6 +354,15 @@ msgid ""
252
354
" Py_TYPE(self)->tp_free(self);\n"
253
355
"}"
254
356
msgstr ""
357
+ "static void\n"
358
+ "newdatatype_dealloc(PyObject *op)\n"
359
+ "{\n"
360
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
361
+ " PyObject_GC_UnTrack(op);\n"
362
+ " Py_CLEAR(self->other_obj);\n"
363
+ " ...\n"
364
+ " Py_TYPE(self)->tp_free(self);\n"
365
+ "}"
255
366
256
367
#: ../../extending/newtypes.rst:97
257
368
msgid ""
@@ -300,6 +411,33 @@ msgid ""
300
411
" Py_TYPE(self)->tp_free(self);\n"
301
412
"}"
302
413
msgstr ""
414
+ "static void\n"
415
+ "my_dealloc(PyObject *obj)\n"
416
+ "{\n"
417
+ " MyObject *self = (MyObject *) obj;\n"
418
+ " PyObject *cbresult;\n"
419
+ "\n"
420
+ " if (self->my_callback != NULL) {\n"
421
+ " PyObject *err_type, *err_value, *err_traceback;\n"
422
+ "\n"
423
+ " /* 这里保存当前异常状态 */\n"
424
+ " PyErr_Fetch(&err_type, &err_value, &err_traceback);\n"
425
+ "\n"
426
+ " cbresult = PyObject_CallNoArgs(self->my_callback);\n"
427
+ " if (cbresult == NULL) {\n"
428
+ " PyErr_WriteUnraisable(self->my_callback);\n"
429
+ " }\n"
430
+ " else {\n"
431
+ " Py_DECREF(cbresult);\n"
432
+ " }\n"
433
+ "\n"
434
+ " /* 这里恢复被保存的异常状态 */\n"
435
+ " PyErr_Restore(err_type, err_value, err_traceback);\n"
436
+ "\n"
437
+ " Py_DECREF(self->my_callback);\n"
438
+ " }\n"
439
+ " Py_TYPE(self)->tp_free(self);\n"
440
+ "}"
303
441
304
442
#: ../../extending/newtypes.rst:138
305
443
msgid ""
@@ -376,6 +514,13 @@ msgid ""
376
514
" self->obj_UnderlyingDatatypePtr->size);\n"
377
515
"}"
378
516
msgstr ""
517
+ "static PyObject *\n"
518
+ "newdatatype_repr(PyObject *op)\n"
519
+ "{\n"
520
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
521
+ " return PyUnicode_FromFormat(\" Repr-ified_newdatatype{{size:%d}}\" ,\n"
522
+ " self->obj_UnderlyingDatatypePtr->size);\n"
523
+ "}"
379
524
380
525
#: ../../extending/newtypes.rst:182
381
526
msgid ""
@@ -417,6 +562,13 @@ msgid ""
417
562
" self->obj_UnderlyingDatatypePtr->size);\n"
418
563
"}"
419
564
msgstr ""
565
+ "static PyObject *\n"
566
+ "newdatatype_str(PyObject *op)\n"
567
+ "{\n"
568
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
569
+ " return PyUnicode_FromFormat(\" Stringified_newdatatype{{size:%d}}\" ,\n"
570
+ " self->obj_UnderlyingDatatypePtr->size);\n"
571
+ "}"
420
572
421
573
#: ../../extending/newtypes.rst:206
422
574
msgid "Attribute Management"
@@ -680,6 +832,19 @@ msgid ""
680
832
" return NULL;\n"
681
833
"}"
682
834
msgstr ""
835
+ "static PyObject *\n"
836
+ "newdatatype_getattr(PyObject *op, char *name)\n"
837
+ "{\n"
838
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
839
+ " if (strcmp(name,\" data\" ) == 0) {\n"
840
+ " return PyLong_FromLong(self->data);\n"
841
+ " }\n"
842
+ "\n"
843
+ " PyErr_Format(PyExc_AttributeError,\n"
844
+ "\" '%.100s' object has no attribute '%.400s'\" ,\n"
845
+ " Py_TYPE(self)->tp_name, name);\n"
846
+ " return NULL;\n"
847
+ "}"
683
848
684
849
#: ../../extending/newtypes.rst:351
685
850
msgid ""
@@ -704,6 +869,12 @@ msgid ""
704
869
" return -1;\n"
705
870
"}"
706
871
msgstr ""
872
+ "static int\n"
873
+ "newdatatype_setattr(PyObject *op, char *name, PyObject *v)\n"
874
+ "{\n"
875
+ " PyErr_Format(PyExc_RuntimeError,\" Read-only attribute: %s\" , name);\n"
876
+ " return -1;\n"
877
+ "}"
707
878
708
879
#: ../../extending/newtypes.rst:365
709
880
msgid "Object Comparison"
@@ -773,6 +944,31 @@ msgid ""
773
944
" return Py_NewRef(result);\n"
774
945
" }"
775
946
msgstr ""
947
+ "static PyObject *\n"
948
+ "newdatatype_richcmp(PyObject *lhs, PyObject *rhs, int op)\n"
949
+ "{\n"
950
+ " newdatatypeobject *obj1 = (newdatatypeobject *) lhs;\n"
951
+ " newdatatypeobject *obj2 = (newdatatypeobject *) rhs;\n"
952
+ " PyObject *result;\n"
953
+ " int c, size1, size2;\n"
954
+ "\n"
955
+ " /* 省略了确保两个参数均为\n"
956
+ " newdatatype 类型的代码 */\n"
957
+ "\n"
958
+ " size1 = obj1->obj_UnderlyingDatatypePtr->size;\n"
959
+ " size2 = obj2->obj_UnderlyingDatatypePtr->size;\n"
960
+ "\n"
961
+ " switch (op) {\n"
962
+ " case Py_LT: c = size1 < size2; break;\n"
963
+ " case Py_LE: c = size1 <= size2; break;\n"
964
+ " case Py_EQ: c = size1 == size2; break;\n"
965
+ " case Py_NE: c = size1 != size2; break;\n"
966
+ " case Py_GT: c = size1 > size2; break;\n"
967
+ " case Py_GE: c = size1 >= size2; break;\n"
968
+ " }\n"
969
+ " result = c ? Py_True : Py_False;\n"
970
+ " return Py_NewRef(result);\n"
971
+ " }"
776
972
777
973
#: ../../extending/newtypes.rst:415
778
974
msgid "Abstract Protocol Support"
@@ -851,6 +1047,17 @@ msgid ""
851
1047
" return result;\n"
852
1048
"}"
853
1049
msgstr ""
1050
+ "static Py_hash_t\n"
1051
+ "newdatatype_hash(PyObject *op)\n"
1052
+ "{\n"
1053
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
1054
+ " Py_hash_t result;\n"
1055
+ " result = self->some_size + 32767 * self->some_number;\n"
1056
+ " if (result == -1) {\n"
1057
+ " result = -2;\n"
1058
+ " }\n"
1059
+ " return result;\n"
1060
+ "}"
854
1061
855
1062
#: ../../extending/newtypes.rst:460
856
1063
msgid ""
@@ -931,6 +1138,24 @@ msgid ""
931
1138
" return result;\n"
932
1139
"}"
933
1140
msgstr ""
1141
+ "static PyObject *\n"
1142
+ "newdatatype_call(PyObject *op, PyObject *args, PyObject *kwds)\n"
1143
+ "{\n"
1144
+ " newdatatypeobject *self = (newdatatypeobject *) op;\n"
1145
+ " PyObject *result;\n"
1146
+ " const char *arg1;\n"
1147
+ " const char *arg2;\n"
1148
+ " const char *arg3;\n"
1149
+ "\n"
1150
+ " if (!PyArg_ParseTuple(args,\" sss:call\" , &arg1, &arg2, &arg3)) {\n"
1151
+ " return NULL;\n"
1152
+ " }\n"
1153
+ " result = PyUnicode_FromFormat(\n"
1154
+ "\" Returning -- value: [%d] arg1: [%s] arg2: [%s] arg3: [%s]\\ n\" ,\n"
1155
+ " self->obj_UnderlyingDatatypePtr->size,\n"
1156
+ " arg1, arg2, arg3);\n"
1157
+ " return result;\n"
1158
+ "}"
934
1159
935
1160
#: ../../extending/newtypes.rst:510
936
1161
msgid ""
@@ -1074,6 +1299,14 @@ msgid ""
1074
1299
" Py_TYPE(op)->tp_free(op);\n"
1075
1300
"}"
1076
1301
msgstr ""
1302
+ "static void\n"
1303
+ "Trivial_dealloc(PyObject *op)\n"
1304
+ "{\n"
1305
+ " /* 在调用任何析构器之前先清除弱引用 */\n"
1306
+ " PyObject_ClearWeakRefs(op);\n"
1307
+ " /* ... 省略了析构代码的其余部分以保持简短 ... */\n"
1308
+ " Py_TYPE(op)->tp_free(op);\n"
1309
+ "}"
1077
1310
1078
1311
#: ../../extending/newtypes.rst:586
1079
1312
msgid "More Suggestions"