-
-
Notifications
You must be signed in to change notification settings - Fork 53
Expand file tree
/
Copy pathnewtypes_tutorial.po
More file actions
2291 lines (2110 loc) · 91 KB
/
newtypes_tutorial.po
File metadata and controls
2291 lines (2110 loc) · 91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001-2018, Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: Python 3.6\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-17 23:44+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Dong-gweon Oh <flowdas@gmail.com>\n"
"Language-Team: Korean (https://python.flowdas.com)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n"
#: ../../extending/newtypes_tutorial.rst:7
msgid "Defining Extension Types: Tutorial"
msgstr "확장형 정의하기: 자습서"
#: ../../extending/newtypes_tutorial.rst:14
msgid ""
"Python allows the writer of a C extension module to define new types that"
" can be manipulated from Python code, much like the built-in :class:`str`"
" and :class:`list` types. The code for all extension types follows a "
"pattern, but there are some details that you need to understand before "
"you can get started. This document is a gentle introduction to the "
"topic."
msgstr ""
"파이썬은 C 확장 모듈 작성자가 내장 :class:`str`\\과 :class:`list` 형과 마찬가지로 파이썬 코드에서 조작할 "
"수 있는 새로운 형을 정의할 수 있도록 합니다. 모든 확장형의 코드는 패턴을 따르지만, 시작하기 전에 이해해야 할 세부 사항이 "
"있습니다. 이 설명서는 주제에 대한 간단한 소개입니다."
#: ../../extending/newtypes_tutorial.rst:24
msgid "The Basics"
msgstr "기초"
#: ../../extending/newtypes_tutorial.rst:26
#, fuzzy
msgid ""
"The :term:`CPython` runtime sees all Python objects as variables of type "
":c:expr:`PyObject*`, which serves as a \"base type\" for all Python "
"objects. The :c:type:`PyObject` structure itself only contains the "
"object's :term:`reference count` and a pointer to the object's \"type "
"object\". This is where the action is; the type object determines which "
"(C) functions get called by the interpreter when, for instance, an "
"attribute gets looked up on an object, a method called, or it is "
"multiplied by another object. These C functions are called \"type "
"methods\"."
msgstr ""
":term:`CPython` 런타임은 모든 파이썬 객체를 :c:type:`PyObject\\*` 형의 변수로 간주하는데, 이는 모든"
" 파이썬 객체의 \"베이스형\" 역할을 합니다. :c:type:`PyObject` 구조체 자체는 객체의 :term:`참조 횟수 "
"<reference count>`\\와 객체의 \"형 객체\"에 대한 포인터만 포함합니다. 여기가 액션이 일어나는 곳입니다; 형 "
"객체는 예를 들어 객체에서 어트리뷰트를 조회하거나, 메서드를 호출하거나, 다른 객체와 곱할 때 인터프리터가 호출하는 (C) 함수를 "
"결정합니다. 이러한 C 함수를 \"형 메서드\"라고 합니다."
#: ../../extending/newtypes_tutorial.rst:35
msgid ""
"So, if you want to define a new extension type, you need to create a new "
"type object."
msgstr "따라서, 새 확장형을 정의하려면, 새 형 객체를 만들어야 합니다."
#: ../../extending/newtypes_tutorial.rst:38
#, fuzzy
msgid ""
"This sort of thing can only be explained by example, so here's a minimal,"
" but complete, module that defines a new type named :class:`!Custom` "
"inside a C extension module :mod:`!custom`:"
msgstr ""
"이런 종류의 것은 예제로만 설명할 수 있어서, 여기에 C 확장 모듈 :mod:`custom` 내에서 "
":class:`Custom`\\이라는 새 형을 정의하는 최소한이지만 완전한 모듈이 있습니다:"
#: ../../extending/newtypes_tutorial.rst:43
msgid ""
"What we're showing here is the traditional way of defining *static* "
"extension types. It should be adequate for most uses. The C API also "
"allows defining heap-allocated extension types using the "
":c:func:`PyType_FromSpec` function, which isn't covered in this tutorial."
msgstr ""
"여기에 표시하는 것은 *정적인(static)* 확장형을 정의하는 전통적인 방법입니다. 대부분의 용도에 적합해야 합니다. C API는"
" 또한 :c:func:`PyType_FromSpec` 함수를 사용하여 힙 할당 확장형을 정의 할 수 있습니다만, 이 자습서에서는 "
"다루지 않습니다."
#: ../../extending/newtypes_tutorial.rst:48
msgid ""
"#define PY_SSIZE_T_CLEAN\n"
"#include <Python.h>\n"
"\n"
"typedef struct {\n"
" PyObject_HEAD\n"
" /* Type-specific fields go here. */\n"
"} CustomObject;\n"
"\n"
"static PyTypeObject CustomType = {\n"
" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n"
" .tp_name = \"custom.Custom\",\n"
" .tp_doc = PyDoc_STR(\"Custom objects\"),\n"
" .tp_basicsize = sizeof(CustomObject),\n"
" .tp_itemsize = 0,\n"
" .tp_flags = Py_TPFLAGS_DEFAULT,\n"
" .tp_new = PyType_GenericNew,\n"
"};\n"
"\n"
"static PyModuleDef custommodule = {\n"
" .m_base = PyModuleDef_HEAD_INIT,\n"
" .m_name = \"custom\",\n"
" .m_doc = \"Example module that creates an extension type.\",\n"
" .m_size = -1,\n"
"};\n"
"\n"
"PyMODINIT_FUNC\n"
"PyInit_custom(void)\n"
"{\n"
" PyObject *m;\n"
" if (PyType_Ready(&CustomType) < 0)\n"
" return NULL;\n"
"\n"
" m = PyModule_Create(&custommodule);\n"
" if (m == NULL)\n"
" return NULL;\n"
"\n"
" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < "
"0) {\n"
" Py_DECREF(m);\n"
" return NULL;\n"
" }\n"
"\n"
" return m;\n"
"}\n"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:50
msgid ""
"Now that's quite a bit to take in at once, but hopefully bits will seem "
"familiar from the previous chapter. This file defines three things:"
msgstr "이제는 한 번에 배워야 할 것이 많지만, 이전 장과 비슷해 보이기를 바랍니다. 이 파일은 세 가지를 정의합니다:"
#: ../../extending/newtypes_tutorial.rst:53
#, fuzzy
msgid ""
"What a :class:`!Custom` **object** contains: this is the ``CustomObject``"
" struct, which is allocated once for each :class:`!Custom` instance."
msgstr ""
":class:`Custom` **객체**\\에 포함된 것: ``CustomObject`` 구조체이며, 각 "
":class:`Custom` 인스턴스마다 한 번씩 할당됩니다."
#: ../../extending/newtypes_tutorial.rst:55
#, fuzzy
msgid ""
"How the :class:`!Custom` **type** behaves: this is the ``CustomType`` "
"struct, which defines a set of flags and function pointers that the "
"interpreter inspects when specific operations are requested."
msgstr ""
":class:`Custom` **형**\\의 작동 방식: ``CustomType`` 구조체이며, 특정 연산이 요청될 때 인터프리터가"
" 검사하는 플래그와 함수 포인터 집합을 정의합니다."
#: ../../extending/newtypes_tutorial.rst:58
#, fuzzy
msgid ""
"How to initialize the :mod:`!custom` module: this is the "
"``PyInit_custom`` function and the associated ``custommodule`` struct."
msgstr ""
":mod:`custom` 모듈을 초기화하는 방법: ``PyInit_custom`` 함수와 관련 ``custommodule`` "
"구조체입니다."
#: ../../extending/newtypes_tutorial.rst:61
msgid "The first bit is::"
msgstr "첫 번째 것은::"
#: ../../extending/newtypes_tutorial.rst:63
#, python-brace-format
msgid ""
"typedef struct {\n"
" PyObject_HEAD\n"
"} CustomObject;"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:67
#, fuzzy
msgid ""
"This is what a Custom object will contain. ``PyObject_HEAD`` is "
"mandatory at the start of each object struct and defines a field called "
"``ob_base`` of type :c:type:`PyObject`, containing a pointer to a type "
"object and a reference count (these can be accessed using the macros "
":c:macro:`Py_TYPE` and :c:macro:`Py_REFCNT` respectively). The reason "
"for the macro is to abstract away the layout and to enable additional "
"fields in :ref:`debug builds <debug-build>`."
msgstr ""
"이것이 Custom 객체에 포함될 것입니다. ``PyObject_HEAD``\\는 각 객체 구조체의 시작 부분에 필수적으로 오는 "
"것이며, :c:type:`PyObject` 형의 ``ob_base``\\라는 필드를 정의하여, 형 객체에 대한 포인터와 참조 횟수를"
" 포함합니다 (이것들은 각각 매크로 :c:macro:`Py_TYPE`\\과 :c:macro:`Py_REFCNT`\\를 사용하여 "
"액세스 할 수 있습니다). 이것이 매크로인 이유는 배치(layout)를 추상화하고 디버그 빌드에서 추가 필드를 활성화하기 위한 "
"것입니다."
#: ../../extending/newtypes_tutorial.rst:76
msgid ""
"There is no semicolon above after the :c:macro:`PyObject_HEAD` macro. Be "
"wary of adding one by accident: some compilers will complain."
msgstr ""
":c:macro:`PyObject_HEAD` 매크로 뒤에는 세미콜론이 없습니다. 실수로 추가하는 것에 주의하십시오: 일부 컴파일러는"
" 불평할 것입니다."
#: ../../extending/newtypes_tutorial.rst:79
msgid ""
"Of course, objects generally store additional data besides the standard "
"``PyObject_HEAD`` boilerplate; for example, here is the definition for "
"standard Python floats::"
msgstr ""
"물론, 객체는 일반적으로 표준 ``PyObject_HEAD`` 관용구 외에 추가 데이터를 저장합니다; 예를 들어, 표준 파이썬 "
"floats에 대한 정의는 다음과 같습니다::"
#: ../../extending/newtypes_tutorial.rst:83
#, python-brace-format
msgid ""
"typedef struct {\n"
" PyObject_HEAD\n"
" double ob_fval;\n"
"} PyFloatObject;"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:88
msgid "The second bit is the definition of the type object. ::"
msgstr "두 번째 것은 형 객체의 정의입니다. ::"
#: ../../extending/newtypes_tutorial.rst:90
#, python-brace-format
msgid ""
"static PyTypeObject CustomType = {\n"
" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n"
" .tp_name = \"custom.Custom\",\n"
" .tp_doc = PyDoc_STR(\"Custom objects\"),\n"
" .tp_basicsize = sizeof(CustomObject),\n"
" .tp_itemsize = 0,\n"
" .tp_flags = Py_TPFLAGS_DEFAULT,\n"
" .tp_new = PyType_GenericNew,\n"
"};"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:101
msgid ""
"We recommend using C99-style designated initializers as above, to avoid "
"listing all the :c:type:`PyTypeObject` fields that you don't care about "
"and also to avoid caring about the fields' declaration order."
msgstr ""
"신경 쓰지 않는 모든 :c:type:`PyTypeObject` 필드를 나열하지 않고 필드의 선언 순서를 신경 쓰지 않으려면, 위와 "
"같이 C99 스타일의 지명(designated) 초기화자를 사용하는 것이 좋습니다."
#: ../../extending/newtypes_tutorial.rst:105
msgid ""
"The actual definition of :c:type:`PyTypeObject` in :file:`object.h` has "
"many more :ref:`fields <type-structs>` than the definition above. The "
"remaining fields will be filled with zeros by the C compiler, and it's "
"common practice to not specify them explicitly unless you need them."
msgstr ""
":file:`object.h`\\에 있는 :c:type:`PyTypeObject`\\의 실제 정의는 위의 정의보다 더 많은 "
":ref:`필드 <type-structs>`\\를 갖습니다. 나머지 필드는 C 컴파일러에 의해 0으로 채워지며, 필요하지 않으면 "
"명시적으로 지정하지 않는 것이 일반적입니다."
#: ../../extending/newtypes_tutorial.rst:110
msgid "We're going to pick it apart, one field at a time::"
msgstr "한 번에 한 필드씩 따로 다루려고 합니다::"
#: ../../extending/newtypes_tutorial.rst:112
msgid ".ob_base = PyVarObject_HEAD_INIT(NULL, 0)"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:114
msgid ""
"This line is mandatory boilerplate to initialize the ``ob_base`` field "
"mentioned above. ::"
msgstr "이 줄은 위에서 언급한 ``ob_base`` 필드를 초기화하기 위한 필수 상용구입니다. ::"
#: ../../extending/newtypes_tutorial.rst:117
msgid ".tp_name = \"custom.Custom\","
msgstr ""
#: ../../extending/newtypes_tutorial.rst:119
msgid ""
"The name of our type. This will appear in the default textual "
"representation of our objects and in some error messages, for example:"
msgstr "우리 형의 이름. 이것은 객체의 기본 텍스트 표현과 일부 에러 메시지에 나타납니다, 예를 들어:"
#: ../../extending/newtypes_tutorial.rst:122
msgid ""
">>> \"\" + custom.Custom()\n"
"Traceback (most recent call last):\n"
" File \"<stdin>\", line 1, in <module>\n"
"TypeError: can only concatenate str (not \"custom.Custom\") to str"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:129
#, fuzzy
msgid ""
"Note that the name is a dotted name that includes both the module name "
"and the name of the type within the module. The module in this case is "
":mod:`!custom` and the type is :class:`!Custom`, so we set the type name "
"to :class:`!custom.Custom`. Using the real dotted import path is "
"important to make your type compatible with the :mod:`pydoc` and "
":mod:`pickle` modules. ::"
msgstr ""
"이름이 모듈 이름과 모듈 내 형의 이름을 모두 포함하는 점으로 구분된 이름임에 유의하십시오. 이 경우 모듈은 "
":mod:`custom`\\이고 형은 :class:`Custom`\\이라서, 형 이름을 "
":class:`custom.Custom`\\으로 설정합니다. 형이 :mod:`pydoc`\\과 :mod:`pickle` 모듈과 "
"호환되도록 하려면 실제 점으로 구분된 임포트 경로를 사용하는 것이 중요합니다. ::"
#: ../../extending/newtypes_tutorial.rst:135
msgid ""
".tp_basicsize = sizeof(CustomObject),\n"
".tp_itemsize = 0,"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:138
#, fuzzy
msgid ""
"This is so that Python knows how much memory to allocate when creating "
"new :class:`!Custom` instances. :c:member:`~PyTypeObject.tp_itemsize` is"
" only used for variable-sized objects and should otherwise be zero."
msgstr ""
"이것은 새로운 :class:`Custom` 인스턴스를 만들 때 파이썬이 할당할 메모리양을 알 수 있도록 하기 위한 것입니다. "
":c:member:`~PyTypeObject.tp_itemsize`\\는 가변 크기 객체에만 사용되며 그렇지 않으면 0이어야 "
"합니다."
#: ../../extending/newtypes_tutorial.rst:144
#, fuzzy
msgid ""
"If you want your type to be subclassable from Python, and your type has "
"the same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may"
" have problems with multiple inheritance. A Python subclass of your type"
" will have to list your type first in its :attr:`~type.__bases__`, or "
"else it will not be able to call your type's :meth:`~object.__new__` "
"method without getting an error. You can avoid this problem by ensuring "
"that your type has a larger value for "
":c:member:`~PyTypeObject.tp_basicsize` than its base type does. Most of "
"the time, this will be true anyway, because either your base type will be"
" :class:`object`, or else you will be adding data members to your base "
"type, and therefore increasing its size."
msgstr ""
"파이썬에서 형을 서브 클래싱 할 수 있기를 원하고, 형이 베이스형과 같은 "
":c:member:`~PyTypeObject.tp_basicsize`\\를 가지면, 다중 상속에 문제가 있을 수 있습니다. 형의 "
"파이썬 서브 클래스는 :attr:`~class.__bases__`\\에 이 형을 먼저 나열해야 합니다, 그렇지 않으면 에러 없이 "
"형의 :meth:`__new__` 메서드를 호출할 수 없습니다. 형이 베이스형보다 큰 "
":c:member:`~PyTypeObject.tp_basicsize` 값을 갖도록 하여 이 문제점을 피할 수 있습니다. 대부분의 "
"경우, 이것은 어쨌든 만족하는데, 베이스형이 :class:`object`\\이거나, 그렇지 않으면 베이스형에 데이터 멤버를 추가하여"
" 크기를 늘리기 때문입니다."
#: ../../extending/newtypes_tutorial.rst:154
#, fuzzy
msgid "We set the class flags to :c:macro:`Py_TPFLAGS_DEFAULT`. ::"
msgstr "클래스 플래그를 :const:`Py_TPFLAGS_DEFAULT`\\로 설정합니다. ::"
#: ../../extending/newtypes_tutorial.rst:156
msgid ".tp_flags = Py_TPFLAGS_DEFAULT,"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:158
msgid ""
"All types should include this constant in their flags. It enables all of"
" the members defined until at least Python 3.3. If you need further "
"members, you will need to OR the corresponding flags."
msgstr ""
"모든 형은 이 상수를 플래그에 포함해야 합니다. 적어도 파이썬 3.3까지 정의된 모든 멤버를 활성화합니다. 추가 멤버가 필요하면, "
"해당 플래그를 OR 해야 합니다."
#: ../../extending/newtypes_tutorial.rst:162
msgid ""
"We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`."
" ::"
msgstr ":c:member:`~PyTypeObject.tp_doc`\\에 형의 독스트링을 제공합니다. ::"
#: ../../extending/newtypes_tutorial.rst:164
msgid ".tp_doc = PyDoc_STR(\"Custom objects\"),"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:166
#, fuzzy
msgid ""
"To enable object creation, we have to provide a "
":c:member:`~PyTypeObject.tp_new` handler. This is the equivalent of the "
"Python method :meth:`~object.__new__`, but has to be specified "
"explicitly. In this case, we can just use the default implementation "
"provided by the API function :c:func:`PyType_GenericNew`. ::"
msgstr ""
"객체 생성을 가능하게 하려면, :c:member:`~PyTypeObject.tp_new` 처리기를 제공해야 합니다. 이것은 파이썬 "
"메서드 :meth:`__new__`\\와 동등하지만, 명시적으로 지정해야 합니다. 이 경우에는, API 함수 "
":c:func:`PyType_GenericNew`\\에서 제공하는 기본 구현을 그냥 사용할 수 있습니다. ::"
#: ../../extending/newtypes_tutorial.rst:171
msgid ".tp_new = PyType_GenericNew,"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:173
#, fuzzy
msgid ""
"Everything else in the file should be familiar, except for some code in "
":c:func:`!PyInit_custom`::"
msgstr ":c:func:`PyInit_custom`\\의 일부 코드를 제외하고, 파일의 다른 모든 내용은 익숙해야 합니다::"
#: ../../extending/newtypes_tutorial.rst:176
msgid ""
"if (PyType_Ready(&CustomType) < 0)\n"
" return;"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:179
#, fuzzy
msgid ""
"This initializes the :class:`!Custom` type, filling in a number of "
"members to the appropriate default values, including "
":c:member:`~PyObject.ob_type` that we initially set to ``NULL``. ::"
msgstr ""
"이것은 :class:`Custom` 형을 초기화하는데, 처음에 ``NULL``\\로 설정한 :attr:`ob_type`\\을 "
"포함하여, 여러 멤버를 적절한 기본값으로 채웁니다. ::"
#: ../../extending/newtypes_tutorial.rst:183
#, python-brace-format
msgid ""
"if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {"
"\n"
" Py_DECREF(m);\n"
" return NULL;\n"
"}"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:188
#, fuzzy
msgid ""
"This adds the type to the module dictionary. This allows us to create "
":class:`!Custom` instances by calling the :class:`!Custom` class:"
msgstr ""
"이것은 형을 모듈 딕셔너리에 추가합니다. :class:`Custom` 클래스를 호출하여 :class:`Custom` 인스턴스를 만들"
" 수 있도록 합니다:"
#: ../../extending/newtypes_tutorial.rst:191
msgid ""
">>> import custom\n"
">>> mycustom = custom.Custom()"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:196
#, fuzzy
msgid ""
"That's it! All that remains is to build it; put the above code in a file"
" called :file:`custom.c`,"
msgstr "이게 전부입니다! 남아있는 것은 빌드하는 것입니다; 위의 코드를 :file:`custom.c`\\라는 파일에 넣고:"
#: ../../extending/newtypes_tutorial.rst:199
msgid ""
"[build-system]\n"
"requires = [\"setuptools\"]\n"
"build-backend = \"setuptools.build_meta\"\n"
"\n"
"[project]\n"
"name = \"custom\"\n"
"version = \"1\"\n"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:201
#, fuzzy
msgid "in a file called :file:`pyproject.toml`, and"
msgstr "를 :file:`setup.py`\\라는 파일에 넣은 다음; 다음을"
#: ../../extending/newtypes_tutorial.rst:203
msgid ""
"from setuptools import Extension, setup\n"
"setup(ext_modules=[Extension(\"custom\", [\"custom.c\"])])"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:208
msgid "in a file called :file:`setup.py`; then typing"
msgstr "를 :file:`setup.py`\\라는 파일에 넣은 다음; 다음을"
#: ../../extending/newtypes_tutorial.rst:210
#: ../../extending/newtypes_tutorial.rst:525
msgid "$ python -m pip install ."
msgstr ""
#: ../../extending/newtypes_tutorial.rst:214
#, fuzzy
msgid ""
"in a shell should produce a file :file:`custom.so` in a subdirectory and "
"install it; now fire up Python --- you should be able to ``import "
"custom`` and play around with ``Custom`` objects."
msgstr ""
"셸에서 입력하면 서브 디렉터리에 파일 :file:`custom.so`\\를 생성해야 합니다; 해당 디렉터리로 이동하여 파이썬을 "
"시작하십시오 --- ``import custom`` 할 수 있고 Custom 객체로 놀 수 있습니다."
#: ../../extending/newtypes_tutorial.rst:218
msgid "That wasn't so hard, was it?"
msgstr "그렇게 어렵지 않습니다, 그렇지 않나요?"
#: ../../extending/newtypes_tutorial.rst:220
msgid ""
"Of course, the current Custom type is pretty uninteresting. It has no "
"data and doesn't do anything. It can't even be subclassed."
msgstr "물론, 현재 Custom 형은 그리 흥미롭지 않습니다. 데이터가 없고 아무것도 하지 않습니다. 서브 클래싱조차 할 수 없습니다."
#: ../../extending/newtypes_tutorial.rst:225
msgid "Adding data and methods to the Basic example"
msgstr "기초 예제에 데이터와 메서드 추가하기"
#: ../../extending/newtypes_tutorial.rst:227
#, fuzzy
msgid ""
"Let's extend the basic example to add some data and methods. Let's also "
"make the type usable as a base class. We'll create a new module, "
":mod:`!custom2` that adds these capabilities:"
msgstr ""
"데이터와 메서드를 추가하도록 기초 예제를 확장해 봅시다. 형을 베이스 클래스로도 사용할 수 있도록 합시다. 다음 기능을 추가하는 새"
" 모듈 :mod:`custom2`\\를 만들 것입니다:"
#: ../../extending/newtypes_tutorial.rst:231
msgid ""
"#define PY_SSIZE_T_CLEAN\n"
"#include <Python.h>\n"
"#include <stddef.h> /* for offsetof() */\n"
"\n"
"typedef struct {\n"
" PyObject_HEAD\n"
" PyObject *first; /* first name */\n"
" PyObject *last; /* last name */\n"
" int number;\n"
"} CustomObject;\n"
"\n"
"static void\n"
"Custom_dealloc(CustomObject *self)\n"
"{\n"
" Py_XDECREF(self->first);\n"
" Py_XDECREF(self->last);\n"
" Py_TYPE(self)->tp_free((PyObject *) self);\n"
"}\n"
"\n"
"static PyObject *\n"
"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
"{\n"
" CustomObject *self;\n"
" self = (CustomObject *) type->tp_alloc(type, 0);\n"
" if (self != NULL) {\n"
" self->first = PyUnicode_FromString(\"\");\n"
" if (self->first == NULL) {\n"
" Py_DECREF(self);\n"
" return NULL;\n"
" }\n"
" self->last = PyUnicode_FromString(\"\");\n"
" if (self->last == NULL) {\n"
" Py_DECREF(self);\n"
" return NULL;\n"
" }\n"
" self->number = 0;\n"
" }\n"
" return (PyObject *) self;\n"
"}\n"
"\n"
"static int\n"
"Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)\n"
"{\n"
" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n"
" PyObject *first = NULL, *last = NULL;\n"
"\n"
" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOi\", kwlist,\n"
" &first, &last,\n"
" &self->number))\n"
" return -1;\n"
"\n"
" if (first) {\n"
" Py_XSETREF(self->first, Py_NewRef(first));\n"
" }\n"
" if (last) {\n"
" Py_XSETREF(self->last, Py_NewRef(last));\n"
" }\n"
" return 0;\n"
"}\n"
"\n"
"static PyMemberDef Custom_members[] = {\n"
" {\"first\", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,\n"
" \"first name\"},\n"
" {\"last\", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,\n"
" \"last name\"},\n"
" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n"
" \"custom number\"},\n"
" {NULL} /* Sentinel */\n"
"};\n"
"\n"
"static PyObject *\n"
"Custom_name(CustomObject *self, PyObject *Py_UNUSED(ignored))\n"
"{\n"
" if (self->first == NULL) {\n"
" PyErr_SetString(PyExc_AttributeError, \"first\");\n"
" return NULL;\n"
" }\n"
" if (self->last == NULL) {\n"
" PyErr_SetString(PyExc_AttributeError, \"last\");\n"
" return NULL;\n"
" }\n"
" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n"
"}\n"
"\n"
"static PyMethodDef Custom_methods[] = {\n"
" {\"name\", (PyCFunction) Custom_name, METH_NOARGS,\n"
" \"Return the name, combining the first and last name\"\n"
" },\n"
" {NULL} /* Sentinel */\n"
"};\n"
"\n"
"static PyTypeObject CustomType = {\n"
" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n"
" .tp_name = \"custom2.Custom\",\n"
" .tp_doc = PyDoc_STR(\"Custom objects\"),\n"
" .tp_basicsize = sizeof(CustomObject),\n"
" .tp_itemsize = 0,\n"
" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n"
" .tp_new = Custom_new,\n"
" .tp_init = (initproc) Custom_init,\n"
" .tp_dealloc = (destructor) Custom_dealloc,\n"
" .tp_members = Custom_members,\n"
" .tp_methods = Custom_methods,\n"
"};\n"
"\n"
"static PyModuleDef custommodule = {\n"
" .m_base =PyModuleDef_HEAD_INIT,\n"
" .m_name = \"custom2\",\n"
" .m_doc = \"Example module that creates an extension type.\",\n"
" .m_size = -1,\n"
"};\n"
"\n"
"PyMODINIT_FUNC\n"
"PyInit_custom2(void)\n"
"{\n"
" PyObject *m;\n"
" if (PyType_Ready(&CustomType) < 0)\n"
" return NULL;\n"
"\n"
" m = PyModule_Create(&custommodule);\n"
" if (m == NULL)\n"
" return NULL;\n"
"\n"
" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < "
"0) {\n"
" Py_DECREF(m);\n"
" return NULL;\n"
" }\n"
"\n"
" return m;\n"
"}\n"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:234
msgid "This version of the module has a number of changes."
msgstr "이 버전의 모듈에는 여러 가지 변경 사항이 있습니다."
#: ../../extending/newtypes_tutorial.rst:236
#, fuzzy
msgid ""
"The :class:`!Custom` type now has three data attributes in its C struct,"
" *first*, *last*, and *number*. The *first* and *last* variables are "
"Python strings containing first and last names. The *number* attribute "
"is a C integer."
msgstr ""
":class:`Custom` 형은 이제 C 구조체에 *first*, *last* 및 *number*\\의 세 가지 데이터 "
"어트리뷰트가 있습니다. *first*\\와 *last* 변수는 이름과 성을 포함하는 파이썬 문자열입니다. *number* "
"어트리뷰트는 C 정수입니다."
#: ../../extending/newtypes_tutorial.rst:240
msgid "The object structure is updated accordingly::"
msgstr "객체 구조체는 다음과 같이 갱신됩니다::"
#: ../../extending/newtypes_tutorial.rst:242
#, python-brace-format
msgid ""
"typedef struct {\n"
" PyObject_HEAD\n"
" PyObject *first; /* first name */\n"
" PyObject *last; /* last name */\n"
" int number;\n"
"} CustomObject;"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:249
msgid ""
"Because we now have data to manage, we have to be more careful about "
"object allocation and deallocation. At a minimum, we need a deallocation"
" method::"
msgstr "이제 관리할 데이터가 있기 때문에, 객체 할당과 할당 해제에 관해 더욱 신중해야 합니다. 최소한, 할당 해제 메서드가 필요합니다::"
#: ../../extending/newtypes_tutorial.rst:252
#, python-brace-format
msgid ""
"static void\n"
"Custom_dealloc(CustomObject *self)\n"
"{\n"
" Py_XDECREF(self->first);\n"
" Py_XDECREF(self->last);\n"
" Py_TYPE(self)->tp_free((PyObject *) self);\n"
"}"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:260
msgid "which is assigned to the :c:member:`~PyTypeObject.tp_dealloc` member::"
msgstr "이는 :c:member:`~PyTypeObject.tp_dealloc` 멤버에 대입됩니다::"
#: ../../extending/newtypes_tutorial.rst:262
msgid ".tp_dealloc = (destructor) Custom_dealloc,"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:264
#, fuzzy
msgid ""
"This method first clears the reference counts of the two Python "
"attributes. :c:func:`Py_XDECREF` correctly handles the case where its "
"argument is ``NULL`` (which might happen here if ``tp_new`` failed "
"midway). It then calls the :c:member:`~PyTypeObject.tp_free` member of "
"the object's type (computed by ``Py_TYPE(self)``) to free the object's "
"memory. Note that the object's type might not be :class:`!CustomType`, "
"because the object may be an instance of a subclass."
msgstr ""
"이 메서드는 먼저 두 파이썬 어트리뷰트의 참조 횟수를 지웁니다. :c:func:`Py_XDECREF`\\는 인자가 "
"``NULL``\\인 경우(``tp_new``\\가 중간에 실패하면 발생할 수 있습니다)를 올바르게 처리합니다. 그런 다음 객체 "
"형(``Py_TYPE(self)``\\로 계산합니다)의 :c:member:`~PyTypeObject.tp_free` 멤버를 호출하여"
" 객체의 메모리를 해제합니다. 객체 형이 :class:`CustomType`\\이 아닐 수 있음에 유의하십시오, 객체는 서브 "
"클래스의 인스턴스일 수 있기 때문입니다."
#: ../../extending/newtypes_tutorial.rst:273
msgid ""
"The explicit cast to ``destructor`` above is needed because we defined "
"``Custom_dealloc`` to take a ``CustomObject *`` argument, but the "
"``tp_dealloc`` function pointer expects to receive a ``PyObject *`` "
"argument. Otherwise, the compiler will emit a warning. This is object-"
"oriented polymorphism, in C!"
msgstr ""
"``CustomObject *`` 인자를 취하도록 ``Custom_dealloc``\\을 정의했지만, ``tp_dealloc`` "
"함수 포인터는 ``PyObject *`` 인자를 받을 것으로 기대하기 때문에 위의 ``destructor``\\로의 명시적 캐스트가"
" 필요합니다. 그렇지 않으면, 컴파일러에서 경고가 발생합니다. 이것이 C로 하는 객체 지향 다형성입니다!"
#: ../../extending/newtypes_tutorial.rst:279
msgid ""
"We want to make sure that the first and last names are initialized to "
"empty strings, so we provide a ``tp_new`` implementation::"
msgstr "우리는 성과 이름이 빈 문자열로 초기화되도록 하고 싶어서, ``tp_new`` 구현을 제공합니다::"
#: ../../extending/newtypes_tutorial.rst:282
msgid ""
"static PyObject *\n"
"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
"{\n"
" CustomObject *self;\n"
" self = (CustomObject *) type->tp_alloc(type, 0);\n"
" if (self != NULL) {\n"
" self->first = PyUnicode_FromString(\"\");\n"
" if (self->first == NULL) {\n"
" Py_DECREF(self);\n"
" return NULL;\n"
" }\n"
" self->last = PyUnicode_FromString(\"\");\n"
" if (self->last == NULL) {\n"
" Py_DECREF(self);\n"
" return NULL;\n"
" }\n"
" self->number = 0;\n"
" }\n"
" return (PyObject *) self;\n"
"}"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:303
msgid "and install it in the :c:member:`~PyTypeObject.tp_new` member::"
msgstr "그리고 그것을 :c:member:`~PyTypeObject.tp_new` 멤버에 설치합니다::"
#: ../../extending/newtypes_tutorial.rst:305
msgid ".tp_new = Custom_new,"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:307
#, fuzzy
msgid ""
"The ``tp_new`` handler is responsible for creating (as opposed to "
"initializing) objects of the type. It is exposed in Python as the "
":meth:`~object.__new__` method. It is not required to define a ``tp_new``"
" member, and indeed many extension types will simply reuse "
":c:func:`PyType_GenericNew` as done in the first version of the "
":class:`!Custom` type above. In this case, we use the ``tp_new`` handler"
" to initialize the ``first`` and ``last`` attributes to non-``NULL`` "
"default values."
msgstr ""
"``tp_new`` 처리기는 형의 객체를 (초기화와 대비하여) 생성하는 책임을 집니다. 파이썬에서 :meth:`__new__` "
"메서드로 노출됩니다. ``tp_new`` 멤버를 정의할 필요는 없으며, 실제로 많은 확장형은 위의 ``Custom`` 형의 첫 번째"
" 버전에서처럼 :c:func:`PyType_GenericNew`\\를 재사용하기만 합니다. 지금은, ``tp_new`` 처리기를 "
"사용하여 ``first``\\와 ``last`` 어트리뷰트를 ``NULL``\\이 아닌 기본값으로 초기화합니다."
#: ../../extending/newtypes_tutorial.rst:315
msgid ""
"``tp_new`` is passed the type being instantiated (not necessarily "
"``CustomType``, if a subclass is instantiated) and any arguments passed "
"when the type was called, and is expected to return the instance created."
" ``tp_new`` handlers always accept positional and keyword arguments, but"
" they often ignore the arguments, leaving the argument handling to "
"initializer (a.k.a. ``tp_init`` in C or ``__init__`` in Python) methods."
msgstr ""
"``tp_new``\\는 인스턴스 화 되는 형(서브 클래스가 인스턴스 화 되면, 반드시 ``CustomType``\\일 필요는 "
"없습니다)과 형이 호출될 때 전달된 모든 인자가 전달되며, 만들어진 인스턴스를 반환할 것으로 기대됩니다. ``tp_new`` "
"처리기는 항상 위치와 키워드 인자를 받아들이지만, 종종 인자를 무시하고 인자 처리를 초기화 (C의 ``tp_init``\\나 "
"파이썬의 ``__init__``) 메서드에게 남겨둡니다."
#: ../../extending/newtypes_tutorial.rst:323
msgid ""
"``tp_new`` shouldn't call ``tp_init`` explicitly, as the interpreter will"
" do it itself."
msgstr "인터프리터가 직접 할 것이라서, ``tp_new``\\는 명시적으로 ``tp_init``\\를 호출하면 안 됩니다."
#: ../../extending/newtypes_tutorial.rst:326
msgid ""
"The ``tp_new`` implementation calls the "
":c:member:`~PyTypeObject.tp_alloc` slot to allocate memory::"
msgstr "``tp_new`` 구현은 :c:member:`~PyTypeObject.tp_alloc` 슬롯을 호출하여 메모리를 할당합니다::"
#: ../../extending/newtypes_tutorial.rst:329
msgid "self = (CustomObject *) type->tp_alloc(type, 0);"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:331
msgid ""
"Since memory allocation may fail, we must check the "
":c:member:`~PyTypeObject.tp_alloc` result against ``NULL`` before "
"proceeding."
msgstr ""
"메모리 할당이 실패할 수 있어서, 진행하기 전에 :c:member:`~PyTypeObject.tp_alloc` 결과가 "
"``NULL``\\이 아닌지 확인해야 합니다."
#: ../../extending/newtypes_tutorial.rst:335
msgid ""
"We didn't fill the :c:member:`~PyTypeObject.tp_alloc` slot ourselves. "
"Rather :c:func:`PyType_Ready` fills it for us by inheriting it from our "
"base class, which is :class:`object` by default. Most types use the "
"default allocation strategy."
msgstr ""
"우리는 :c:member:`~PyTypeObject.tp_alloc` 슬롯을 직접 채우지 않았습니다. 대신 "
":c:func:`PyType_Ready`\\가 베이스 클래스(기본적으로 :class:`object`\\입니다)에서 상속하여 이를 "
"채웁니다. 대부분의 형은 기본 할당 전략을 사용합니다."
#: ../../extending/newtypes_tutorial.rst:341
#, fuzzy
msgid ""
"If you are creating a co-operative :c:member:`~PyTypeObject.tp_new` (one "
"that calls a base type's :c:member:`~PyTypeObject.tp_new` or "
":meth:`~object.__new__`), you must *not* try to determine what method to "
"call using method resolution order at runtime. Always statically "
"determine what type you are going to call, and call its "
":c:member:`~PyTypeObject.tp_new` directly, or via "
"``type->tp_base->tp_new``. If you do not do this, Python subclasses of "
"your type that also inherit from other Python-defined classes may not "
"work correctly. (Specifically, you may not be able to create instances of"
" such subclasses without getting a :exc:`TypeError`.)"
msgstr ""
"협업 :c:member:`~PyTypeObject.tp_new`\\(베이스형의 "
":c:member:`~PyTypeObject.tp_new`\\나 :meth:`__new__`\\를 호출하는 것)를 만드는 경우, "
"실행 시간에 메서드 결정 순서를 사용하여 호출할 메서드를 결정하려고 하지 *않아야* 합니다. 항상 어떤 형을 호출할지 정적으로 "
"결정하고, 그것의 :c:member:`~PyTypeObject.tp_new`\\를 직접, 또는 "
"``type->tp_base->tp_new``\\를 통해 호출하십시오. 이렇게 하지 않으면, 다른 파이썬 정의 클래스도 상속하는 "
"여러분 형의 파이썬 서브 클래스가 올바르게 작동하지 않을 수 있습니다. (특히, :exc:`TypeError`\\를 얻지 않으면서,"
" 이러한 서브 클래스의 인스턴스를 만들지 못할 수도 있습니다.)"
#: ../../extending/newtypes_tutorial.rst:351
msgid ""
"We also define an initialization function which accepts arguments to "
"provide initial values for our instance::"
msgstr "인스턴스의 초깃값을 제공하는 인자를 받아들이는 초기화 함수도 정의합니다::"
#: ../../extending/newtypes_tutorial.rst:354
msgid ""
"static int\n"
"Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)\n"
"{\n"
" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n"
" PyObject *first = NULL, *last = NULL, *tmp;\n"
"\n"
" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOi\", kwlist,\n"
" &first, &last,\n"
" &self->number))\n"
" return -1;\n"
"\n"
" if (first) {\n"
" tmp = self->first;\n"
" Py_INCREF(first);\n"
" self->first = first;\n"
" Py_XDECREF(tmp);\n"
" }\n"
" if (last) {\n"
" tmp = self->last;\n"
" Py_INCREF(last);\n"
" self->last = last;\n"
" Py_XDECREF(tmp);\n"
" }\n"
" return 0;\n"
"}"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:380
msgid "by filling the :c:member:`~PyTypeObject.tp_init` slot. ::"
msgstr "이것으로 :c:member:`~PyTypeObject.tp_init` 슬롯을 채웁니다::"
#: ../../extending/newtypes_tutorial.rst:382
msgid ".tp_init = (initproc) Custom_init,"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:384
#, fuzzy
msgid ""
"The :c:member:`~PyTypeObject.tp_init` slot is exposed in Python as the "
":meth:`~object.__init__` method. It is used to initialize an object "
"after it's created. Initializers always accept positional and keyword "
"arguments, and they should return either ``0`` on success or ``-1`` on "
"error."
msgstr ""
":c:member:`~PyTypeObject.tp_init` 슬롯은 파이썬에서 :meth:`__init__` 메서드로 노출됩니다. "
"객체가 만들어진 후 초기화하는 데 사용됩니다. 초기화자는 항상 위치와 키워드 인자를 받아들이며 성공 시 ``0`` 또는 에러 시 "
"``-1``\\을 반환해야 합니다."
#: ../../extending/newtypes_tutorial.rst:389
#, fuzzy
msgid ""
"Unlike the ``tp_new`` handler, there is no guarantee that ``tp_init`` is "
"called at all (for example, the :mod:`pickle` module by default doesn't "
"call :meth:`~object.__init__` on unpickled instances). It can also be "
"called multiple times. Anyone can call the :meth:`!__init__` method on "
"our objects. For this reason, we have to be extra careful when assigning"
" the new attribute values. We might be tempted, for example to assign "
"the ``first`` member like this::"
msgstr ""
"``tp_new`` 처리기와 달리, ``tp_init``\\가 아예 호출되지 않을 수도 있습니다 (예를 들어, "
":mod:`pickle` 모듈은 기본적으로 역 피클 된 인스턴스에서 :meth:`__init__`\\를 호출하지 않습니다). 여러 "
"번 호출될 수도 있습니다. 누구나 우리 객체의 :meth:`__init__` 메서드를 호출할 수 있습니다. 이런 이유로, 새 "
"어트리뷰트 값을 대입할 때는 각별히 주의해야 합니다. 예를 들어 ``first`` 멤버를 다음과 같이 대입하려고 할 수 있습니다::"
#: ../../extending/newtypes_tutorial.rst:397
#, python-brace-format
msgid ""
"if (first) {\n"
" Py_XDECREF(self->first);\n"
" Py_INCREF(first);\n"
" self->first = first;\n"
"}"
msgstr ""
#: ../../extending/newtypes_tutorial.rst:403
msgid ""
"But this would be risky. Our type doesn't restrict the type of the "
"``first`` member, so it could be any kind of object. It could have a "
"destructor that causes code to be executed that tries to access the "
"``first`` member; or that destructor could release the :term:`Global "
"interpreter Lock <GIL>` and let arbitrary code run in other threads that "
"accesses and modifies our object."
msgstr ""
"하지만 이것은 위험합니다. 우리 형은 ``first`` 멤버의 형을 제한하지 않아서, 모든 종류의 객체가 될 수 있습니다. "
"``first`` 멤버에 액세스하려고 시도하는 코드가 실행되도록 하는 파괴자가 있을 수 있습니다; 또는 파괴자가 :term:`전역 "
"인터프리터 록 <GIL>`\\을 해제하고 다른 스레드에서 객체에 액세스하고 수정하는 임의의 코드가 실행되도록 할 수 있습니다."
#: ../../extending/newtypes_tutorial.rst:410
msgid ""
"To be paranoid and protect ourselves against this possibility, we almost "
"always reassign members before decrementing their reference counts. When"
" don't we have to do this?"
msgstr ""
"편집증적이 되고 이 가능성으로부터 우리 자신을 보호하기 위해, 우리는 거의 항상 참조 횟수를 줄이기 전에 멤버를 다시 대입합니다. "
"언제 이렇게 하지 않아도 될까요?"
#: ../../extending/newtypes_tutorial.rst:414
msgid "when we absolutely know that the reference count is greater than 1;"
msgstr "참조 횟수가 1보다 크다는 것을 확실히 알고 있을 때;"
#: ../../extending/newtypes_tutorial.rst:416
msgid ""
"when we know that deallocation of the object [#]_ will neither release "
"the :term:`GIL` nor cause any calls back into our type's code;"
msgstr "객체의 할당 해제가 :term:`GIL`\\을 해제하지도 않고 형의 코드를 다시 호출하지도 않음을 알고 있을 때 [#]_;"
#: ../../extending/newtypes_tutorial.rst:419
msgid ""
"when decrementing a reference count in a "
":c:member:`~PyTypeObject.tp_dealloc` handler on a type which doesn't "
"support cyclic garbage collection [#]_."
msgstr ""
"순환 가비지 수거를 지원하지 않는 형의 :c:member:`~PyTypeObject.tp_dealloc` 처리기에서 참조 횟수를 "
"감소시킬 때 [#]_."
#: ../../extending/newtypes_tutorial.rst:422
msgid ""
"We want to expose our instance variables as attributes. There are a "
"number of ways to do that. The simplest way is to define member "
"definitions::"
msgstr ""
"인스턴스 변수를 어트리뷰트로 노출하려고 합니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 멤버 정의를 "
"정의하는 것입니다::"
#: ../../extending/newtypes_tutorial.rst:425
msgid ""
"static PyMemberDef Custom_members[] = {\n"
" {\"first\", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,\n"
" \"first name\"},\n"
" {\"last\", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,\n"
" \"last name\"},\n"