@@ -45,7 +45,7 @@ extension module :mod:`!custom`:
45
45
allows defining heap-allocated extension types using the
46
46
:c:func: `PyType_FromSpec ` function, which isn't covered in this tutorial.
47
47
48
- .. literalinclude :: ../includes/custom.c
48
+ .. literalinclude :: ../includes/newtypes/ custom.c
49
49
50
50
Now that's quite a bit to take in at once, but hopefully bits will seem familiar
51
51
from the previous chapter. This file defines three things:
@@ -196,36 +196,32 @@ This adds the type to the module dictionary. This allows us to create
196
196
>>> mycustom = custom.Custom()
197
197
198
198
That's it! All that remains is to build it; put the above code in a file called
199
- :file: `custom.c ` and:
199
+ :file: `custom.c `,
200
+
201
+ .. literalinclude :: ../includes/newtypes/pyproject.toml
202
+
203
+ in a file called :file: `pyproject.toml `, and
200
204
201
205
.. code-block :: python
202
206
203
- from distutils.core import setup, Extension
204
- setup(name = " custom" , version = " 1.0" ,
205
- ext_modules = [Extension(" custom" , [" custom.c" ])])
207
+ from setuptools import Extension, setup
208
+ setup(ext_modules = [Extension(" custom" , [" custom.c" ])])
206
209
207
210
in a file called :file: `setup.py `; then typing
208
211
209
212
.. code-block :: shell-session
210
213
211
- $ python setup.py build
214
+ $ python -m pip install .
212
215
213
- at a shell should produce a file :file: `custom.so ` in a subdirectory; move to
214
- that directory and fire up Python --- you should be able to ``import custom `` and
215
- play around with Custom objects.
216
+ in a shell should produce a file :file: `custom.so ` in a subdirectory
217
+ and install it; now fire up Python --- you should be able to ``import custom ``
218
+ and play around with `` Custom `` objects.
216
219
217
220
That wasn't so hard, was it?
218
221
219
222
Of course, the current Custom type is pretty uninteresting. It has no data and
220
223
doesn't do anything. It can't even be subclassed.
221
224
222
- .. note ::
223
- While this documentation showcases the standard :mod: `!distutils ` module
224
- for building C extensions, it is recommended in real-world use cases to
225
- use the newer and better-maintained ``setuptools `` library. Documentation
226
- on how to do this is out of scope for this document and can be found in
227
- the `Python Packaging User's Guide <https://packaging.python.org/tutorials/distributing-packages/ >`_.
228
-
229
225
230
226
Adding data and methods to the Basic example
231
227
============================================
@@ -234,7 +230,7 @@ Let's extend the basic example to add some data and methods. Let's also make
234
230
the type usable as a base class. We'll create a new module, :mod: `!custom2 ` that
235
231
adds these capabilities:
236
232
237
- .. literalinclude :: ../includes/custom2.c
233
+ .. literalinclude :: ../includes/newtypes/ custom2.c
238
234
239
235
240
236
This version of the module has a number of changes.
@@ -516,17 +512,21 @@ We rename :c:func:`!PyInit_custom` to :c:func:`!PyInit_custom2`, update the
516
512
module name in the :c:type: `PyModuleDef ` struct, and update the full class
517
513
name in the :c:type: `PyTypeObject ` struct.
518
514
519
- Finally, we update our :file: `setup.py ` file to build the new module:
515
+ Finally, we update our :file: `setup.py ` file to include the new module,
520
516
521
517
.. code-block :: python
522
518
523
- from distutils.core import setup, Extension
524
- setup(name = " custom" , version = " 1.0" ,
525
- ext_modules = [
526
- Extension(" custom" , [" custom.c" ]),
527
- Extension(" custom2" , [" custom2.c" ]),
528
- ])
519
+ from setuptools import Extension, setup
520
+ setup(ext_modules = [
521
+ Extension(" custom" , [" custom.c" ]),
522
+ Extension(" custom2" , [" custom2.c" ]),
523
+ ])
524
+
525
+ and then we re-install so that we can ``import custom2 ``:
526
+
527
+ .. code-block :: shell-session
529
528
529
+ $ python -m pip install .
530
530
531
531
Providing finer control over data attributes
532
532
============================================
@@ -537,7 +537,7 @@ version of our module, the instance variables :attr:`!first` and :attr:`!last`
537
537
could be set to non-string values or even deleted. We want to make sure that
538
538
these attributes always contain strings.
539
539
540
- .. literalinclude :: ../includes/custom3.c
540
+ .. literalinclude :: ../includes/newtypes/ custom3.c
541
541
542
542
543
543
To provide greater control, over the :attr: `!first ` and :attr: `!last ` attributes,
@@ -684,7 +684,7 @@ To allow a :class:`!Custom` instance participating in a reference cycle to
684
684
be properly detected and collected by the cyclic GC, our :class: `!Custom ` type
685
685
needs to fill two additional slots and to enable a flag that enables these slots:
686
686
687
- .. literalinclude :: ../includes/custom4.c
687
+ .. literalinclude :: ../includes/newtypes/ custom4.c
688
688
689
689
690
690
First, the traversal method lets the cyclic GC know about subobjects that could
@@ -808,7 +808,7 @@ increases an internal counter:
808
808
>>> print(s.increment())
809
809
2
810
810
811
- .. literalinclude :: ../includes/sublist.c
811
+ .. literalinclude :: ../includes/newtypes/ sublist.c
812
812
813
813
814
814
As you can see, the source code closely resembles the :class: `!Custom ` examples in
0 commit comments