suite du dossier extending (#174)

Reviewed-on: AFPy/python-docs-fr#174
Reviewed-by: Julien Palard <julien@palard.fr>
Co-authored-by: Christophe Nanteuil <christophe.nanteuil@gmail.com>
Co-committed-by: Christophe Nanteuil <christophe.nanteuil@gmail.com>
This commit is contained in:
Christophe Nanteuil 2023-11-25 10:54:49 +00:00 committed by Julien Palard
parent 141c4ad19f
commit 4afdbf71c5
2 changed files with 333 additions and 31 deletions

View File

@ -613,6 +613,7 @@ roughly approximativement, à peu près (on ne traduit pas
« roughly equivalent » par « sensiblement équivalent »)
setter mutateur
simple quote guillemet simple
slot emplacement
socket connecteur ou interface de connexion
sort trier (préféré), ordonner, classer
specify définir, préciser (plutôt que « spécifier »)

View File

@ -5,14 +5,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Python 3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-23 14:38+0200\n"
"PO-Revision-Date: 2022-10-18 12:22+0200\n"
"Last-Translator: Julien Palard <julien@palard.fr>\n"
"POT-Creation-Date: 2023-07-22 15:34+0200\n"
"PO-Revision-Date: 2023-07-27 23:20+0200\n"
"Last-Translator: Christophe Nanteuil <christophe.nanteuil@gmail.com>\n"
"Language-Team: FRENCH <traductions@lists.afpy.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.2.2\n"
#: extending/newtypes_tutorial.rst:7
msgid "Defining Extension Types: Tutorial"
@ -37,7 +38,6 @@ msgid "The Basics"
msgstr "Les bases"
#: 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. "
@ -49,7 +49,7 @@ msgid ""
"functions are called \"type methods\"."
msgstr ""
":term:`CPython` considère que tous les objets Python sont des variables de "
"type :c:type:`PyObject\\*`, qui sert de type de base pour tous les objets "
"type :c:expr:`PyObject*`, qui sert de type de base pour tous les objets "
"Python. La structure de :c:type:`PyObject` ne contient que le :term:"
"`compteur de références <reference count>` et un pointeur vers un objet de "
"type « type de l'objet ». C'est ici que tout se joue : l'objet type "
@ -76,6 +76,7 @@ msgstr ""
"donc un module minimaliste mais suffisant qui définit un nouveau type nommé :"
"class:`Custom` dans le module d'extension :mod:`custom` :"
# suit un :
#: extending/newtypes_tutorial.rst:43
msgid ""
"What we're showing here is the traditional way of defining *static* "
@ -83,7 +84,7 @@ msgid ""
"allows defining heap-allocated extension types using the :c:func:"
"`PyType_FromSpec` function, which isn't covered in this tutorial."
msgstr ""
"Ce qui est montré ici est la manière traditionnelle de définir des types "
"ce qui est montré ici est la manière traditionnelle de définir des types "
"d'extension *statiques*, et cela convient dans la majorité des cas. L'API C "
"permet aussi de définir des types alloués sur le tas, via la fonction :c:"
"func:`PyType_FromSpec`, mais ce n'est pas couvert par ce tutoriel."
@ -128,7 +129,6 @@ msgid "The first bit is::"
msgstr "Commençons par ::"
#: 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 "
@ -146,12 +146,13 @@ msgstr ""
"raison d'être de ces macros est d'abstraire l'agencement de la structure, et "
"ainsi de permettre l'ajout de champs en :ref:`mode débogage <debug-build>`."
# suit un :
#: 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 ""
"Il n'y a pas de point-virgule après la macro :c:macro:`PyObject_HEAD`. "
"il n'y a pas de point-virgule après la macro :c:macro:`PyObject_HEAD`. "
"Attention à ne pas l'ajouter par accident : certains compilateurs pourraient "
"s'en plaindre."
@ -169,13 +170,14 @@ msgstr ""
msgid "The second bit is the definition of the type object. ::"
msgstr "La deuxième partie est la définition de l'objet type ::"
# suit un :
#: 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 ""
"Nous recommandons d'utiliser la syntaxe d'initialisation nommée (C99) pour "
"nous recommandons d'utiliser la syntaxe d'initialisation nommée (C99) pour "
"remplir la structure, comme ci-dessus, afin d'éviter d'avoir à lister les "
"champs de :c:type:`PyTypeObject` dont vous n'avez pas besoin, et de ne pas "
"vous soucier de leur ordre."
@ -222,7 +224,7 @@ msgid ""
"type compatible with the :mod:`pydoc` and :mod:`pickle` modules. ::"
msgstr ""
"Notez que le nom comporte un point : il inclut le nom du module et le nom du "
"type. Dans ce cas le module est :mod:`custom`, et le type est :class:"
"type. Dans ce cas le module est :mod:`custom` et le type est :class:"
"`Custom`, donc nous donnons comme nom :class:`custom.Custom`. Nommer "
"correctement son type, avec le point, est important pour le rendre "
"compatible avec :mod:`pydoc` et :mod:`pickle`. ::"
@ -238,6 +240,7 @@ msgstr ""
"n'est utilisé que pour les objets de taille variable, sinon il doit rester à "
"zéro."
# suit un :
#: extending/newtypes_tutorial.rst:144
msgid ""
"If you want your type to be subclassable from Python, and your type has the "
@ -251,7 +254,7 @@ msgid ""
"type will be :class:`object`, or else you will be adding data members to "
"your base type, and therefore increasing its size."
msgstr ""
"Si vous voulez qu'une classe en Python puisse hériter de votre type, et que "
"si vous voulez qu'une classe en Python puisse hériter de votre type, et que "
"votre type a le même :c:member:`~PyTypeObject.tp_basicsize` que son parent, "
"vous rencontrerez des problèmes avec l'héritage multiple. Une sous-classe "
"Python de votre type devra lister votre type en premier dans son :attr:"
@ -263,11 +266,9 @@ msgstr ""
"augmentant ainsi sa taille)."
#: extending/newtypes_tutorial.rst:154
#, fuzzy
msgid "We set the class flags to :c:macro:`Py_TPFLAGS_DEFAULT`. ::"
msgstr ""
"On utilise la constante :const:`Py_TPFLAGS_DEFAULT` comme seule option de "
"type. ::"
"Nous définissons les drapeaux de la classe à :c:macro:`Py_TPFLAGS_DEFAULT` ::"
#: extending/newtypes_tutorial.rst:158
msgid ""
@ -277,14 +278,14 @@ msgid ""
msgstr ""
"Chaque type doit inclure cette constante dans ses options : elle active tous "
"les membres définis jusqu'à au moins Python 3.3. Si vous avez besoin de plus "
"de membres, vous pouvez la combiner à d'autres constantes avec un *ou* "
"de membres, vous pouvez la combiner à d'autres constantes avec un *OU* "
"binaire."
#: extending/newtypes_tutorial.rst:162
msgid ""
"We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`. ::"
msgstr ""
"On fournit une *docstring* pour ce type via le membre :c:member:"
"Nous fournissons une *docstring* pour ce type via le membre :c:member:"
"`~PyTypeObject.tp_doc`. ::"
#: extending/newtypes_tutorial.rst:166
@ -337,7 +338,7 @@ msgstr ""
#: extending/newtypes_tutorial.rst:207
msgid "in a file called :file:`setup.py`; then typing"
msgstr ""
msgstr "dans un fichier appelé :file:`setup.py` ; puis en tapant"
#: extending/newtypes_tutorial.rst:213
msgid ""
@ -345,16 +346,22 @@ msgid ""
"to that directory and fire up Python --- you should be able to ``import "
"custom`` and play around with Custom objects."
msgstr ""
"à un shell doit produire un fichier :file:`custom.so` dans un sous-"
"répertoire ; déplacez-vous dans ce répertoire et lancez Python — vous "
"devriez pouvoir faire ``import custom`` et jouer avec des objets "
"personnalisés."
#: extending/newtypes_tutorial.rst:217
msgid "That wasn't so hard, was it?"
msgstr ""
msgstr "Ce n'était pas si difficile, n'est-ce pas ?"
#: extending/newtypes_tutorial.rst:219
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 ""
"Bien sûr, le type personnalisé actuel est assez inintéressant. Il n'a pas de "
"données et ne fait rien. Il ne peut même pas être sous-classé."
#: extending/newtypes_tutorial.rst:223
msgid ""
@ -365,10 +372,17 @@ msgid ""
"Packaging User's Guide <https://packaging.python.org/tutorials/distributing-"
"packages/>`_."
msgstr ""
"Bien que cette documentation présente le module standard :mod:`distutils` "
"pour la construction d'extensions C, il est recommandé dans les cas "
"d'utilisation réels d'utiliser la bibliothèque ``setuptools`` plus récente "
"et mieux entretenue. La documentation sur la façon de procéder est hors de "
"portée de ce document et peut être trouvée dans le `Python Packaging User's "
"Guide <https://packaging.python.org/tutorials/distributing-packages/>`_."
# suit un :
#: extending/newtypes_tutorial.rst:231
msgid "Adding data and methods to the Basic example"
msgstr ""
msgstr "ajout de données et de méthodes à l'exemple basique"
#: extending/newtypes_tutorial.rst:233
msgid ""
@ -376,20 +390,25 @@ msgid ""
"make the type usable as a base class. We'll create a new module, :mod:"
"`custom2` that adds these capabilities:"
msgstr ""
"Étendons l'exemple de base pour ajouter des données et des méthodes. Rendons "
"également le type utilisable comme classe de base. Nous allons créer un "
"nouveau module, :mod:`custom2` qui ajoute ces fonctionnalités :"
#: extending/newtypes_tutorial.rst:240
msgid "This version of the module has a number of changes."
msgstr ""
msgstr "Cette version du module comporte un certain nombre de modifications."
#: extending/newtypes_tutorial.rst:242
msgid "We've added an extra include::"
msgstr ""
msgstr "Nous avons ajouté un nouvel *include* ::"
#: extending/newtypes_tutorial.rst:246
msgid ""
"This include provides declarations that we use to handle attributes, as "
"described a bit later."
msgstr ""
"Cet *include* fournit des déclarations que nous utilisons pour gérer les "
"attributs, comme décrit un peu plus loin."
#: extending/newtypes_tutorial.rst:249
msgid ""
@ -398,20 +417,27 @@ msgid ""
"strings containing first and last names. The *number* attribute is a C "
"integer."
msgstr ""
"Le type :class:`Custom` a maintenant trois attributs de données dans sa "
"structure C, *first*, *last* et *number*. Les variables *first* et *last* "
"sont des chaînes Python contenant les noms et prénoms. L'attribut *number* "
"est un entier C."
#: extending/newtypes_tutorial.rst:253
msgid "The object structure is updated accordingly::"
msgstr ""
msgstr "La structure de l'objet est mise à jour en conséquence ::"
#: extending/newtypes_tutorial.rst:262
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 ""
"Comme nous avons maintenant des données à gérer, nous devons faire plus "
"attention à l'allocation et à la libération d'objets. Au minimum, nous avons "
"besoin d'une méthode de dés-allocation ::"
#: extending/newtypes_tutorial.rst:273
msgid "which is assigned to the :c:member:`~PyTypeObject.tp_dealloc` member::"
msgstr ""
msgstr "qui est assignée au membre :c:member:`~PyTypeObject.tp_dealloc` ::"
#: extending/newtypes_tutorial.rst:277
msgid ""
@ -423,6 +449,13 @@ msgid ""
"object's type might not be :class:`CustomType`, because the object may be an "
"instance of a subclass."
msgstr ""
"Cette méthode efface d'abord le nombre de références des deux attributs "
"Python. :c:func:`Py_XDECREF` gère correctement le cas où son argument est "
"``NULL`` (ce qui peut arriver ici si ``tp_new`` échoue à mi-chemin). Elle "
"appelle ensuite le membre :c:member:`~PyTypeObject.tp_free` du type de "
"l'objet (calculé par ``Py_TYPE(self)``) pour libérer la mémoire de l'objet. "
"Notez que le type de l'objet peut ne pas être :class:`CustomType`, car "
"l'objet peut être une instance d'une sous-classe."
#: extending/newtypes_tutorial.rst:286
msgid ""
@ -432,16 +465,23 @@ msgid ""
"argument. Otherwise, the compiler will emit a warning. This is object-"
"oriented polymorphism, in C!"
msgstr ""
"La conversion explicite en ``destructor`` ci-dessus est nécessaire car nous "
"avons défini ``Custom_dealloc`` pour prendre un argument ``CustomObject *``, "
"mais le pointeur de fonction ``tp_dealloc`` s'attend à recevoir un argument "
"``PyObject *``. Sinon, le compilateur émet un avertissement. C'est du "
"polymorphisme orienté objet, en C !"
#: extending/newtypes_tutorial.rst:292
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 ""
"Nous voulons nous assurer que le prénom et le nom sont initialisés avec des "
"chaînes vides, nous fournissons donc une implémentation ``tp_new`` ::"
#: extending/newtypes_tutorial.rst:316
msgid "and install it in the :c:member:`~PyTypeObject.tp_new` member::"
msgstr ""
msgstr "et installez-le dans le membre :c:member:`~PyTypeObject.tp_new` ::"
#: extending/newtypes_tutorial.rst:320
msgid ""
@ -453,6 +493,14 @@ msgid ""
"use the ``tp_new`` handler to initialize the ``first`` and ``last`` "
"attributes to non-``NULL`` default values."
msgstr ""
"Le gestionnaire ``tp_new`` est responsable de la création (par opposition à "
"l'initialisation) des objets du type. Il est exposé en Python en tant que "
"méthode :meth:`__new__`. Il n'est pas nécessaire de définir un membre "
"``tp_new``, et en effet de nombreux types d'extension réutiliseront "
"simplement :c:func:`PyType_GenericNew` comme cela a été fait dans la "
"première version du type ``Custom`` ci-dessus. Dans ce cas, nous utilisons "
"le gestionnaire ``tp_new`` pour initialiser les attributs ``first`` et "
"``last`` à des valeurs par défaut non ``NULL``."
#: extending/newtypes_tutorial.rst:328
msgid ""
@ -463,24 +511,38 @@ msgid ""
"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`` reçoit le type en cours d'instanciation (pas nécessairement "
"``CustomType``, si une sous-classe est instanciée) et tous les arguments "
"passés lorsque le type a été appelé, et devrait renvoyer l'instance créée. "
"Les gestionnaires ``tp_new`` acceptent toujours les arguments positionnels "
"et nommés, mais ils ignorent souvent les arguments, laissant la gestion des "
"arguments aux méthodes d'initialisation (alias ``tp_init`` en C ou "
"``__init__`` en Python)."
#: extending/newtypes_tutorial.rst:336
msgid ""
"``tp_new`` shouldn't call ``tp_init`` explicitly, as the interpreter will do "
"it itself."
msgstr ""
"``tp_new`` ne doit pas appeler ``tp_init`` explicitement, car l'interpréteur "
"le fera lui-même."
#: extending/newtypes_tutorial.rst:339
msgid ""
"The ``tp_new`` implementation calls the :c:member:`~PyTypeObject.tp_alloc` "
"slot to allocate memory::"
msgstr ""
"L'implémentation ``tp_new`` appelle l'emplacement :c:member:`~PyTypeObject."
"tp_alloc` pour allouer de la mémoire ::"
#: extending/newtypes_tutorial.rst:344
msgid ""
"Since memory allocation may fail, we must check the :c:member:`~PyTypeObject."
"tp_alloc` result against ``NULL`` before proceeding."
msgstr ""
"Puisque l'allocation de mémoire peut échouer, nous devons vérifier le "
"résultat :c:member:`~PyTypeObject.tp_alloc` par rapport à ``NULL`` avant de "
"continuer."
#: extending/newtypes_tutorial.rst:348
msgid ""
@ -489,6 +551,10 @@ msgid ""
"class, which is :class:`object` by default. Most types use the default "
"allocation strategy."
msgstr ""
"Nous n'avons pas rempli l'emplacement :c:member:`~PyTypeObject.tp_alloc` "
"nous-mêmes. C'est :c:func:`PyType_Ready` qui le remplit pour nous car il en "
"hérite de notre classe mère, qui est :class:`object` par défaut. La plupart "
"des types utilisent la stratégie d'allocation par défaut."
#: extending/newtypes_tutorial.rst:354
msgid ""
@ -502,16 +568,28 @@ msgid ""
"correctly. (Specifically, you may not be able to create instances of such "
"subclasses without getting a :exc:`TypeError`.)"
msgstr ""
"Si vous créez une :c:member:`~PyTypeObject.tp_new` coopérative (qui appelle :"
"c:member:`~PyTypeObject.tp_new` ou :meth:`__new__` d'un type de base), vous "
"ne devez *pas* essayer de déterminer quelle méthode appeler en utilisant "
"l'ordre de résolution des méthodes au moment de l'exécution. Déterminez "
"toujours statiquement quel type vous allez appeler, et appelez son :c:member:"
"`~PyTypeObject.tp_new` directement, ou via ``type->tp_base->tp_new``. Si "
"vous ne le faites pas, les sous-classes Python de votre type qui héritent "
"également d'autres classes définies par Python risquent de ne pas "
"fonctionner correctement. (Plus précisément, vous ne pourrez peut-être pas "
"créer d'instances de telles sous-classes sans obtenir une :exc:`TypeError`.)"
#: extending/newtypes_tutorial.rst:364
msgid ""
"We also define an initialization function which accepts arguments to provide "
"initial values for our instance::"
msgstr ""
"Nous définissons également une fonction d'initialisation qui accepte des "
"arguments pour fournir des valeurs initiales pour notre instance ::"
#: extending/newtypes_tutorial.rst:393
msgid "by filling the :c:member:`~PyTypeObject.tp_init` slot. ::"
msgstr ""
msgstr "en remplissant l'emplacement :c:member:`~PyTypeObject.tp_init`. ::"
#: extending/newtypes_tutorial.rst:397
msgid ""
@ -520,6 +598,11 @@ msgid ""
"Initializers always accept positional and keyword arguments, and they should "
"return either ``0`` on success or ``-1`` on error."
msgstr ""
"L'emplacement :c:member:`~PyTypeObject.tp_init` est exposé en Python en tant "
"que méthode :meth:`__init__`. Il est utilisé pour initialiser un objet après "
"sa création. Les constructeurs acceptent toujours les arguments positionnels "
"et nommés, et ils doivent renvoyer soit ``0`` en cas de succès, soit ``-1`` "
"en cas d'erreur."
#: extending/newtypes_tutorial.rst:402
msgid ""
@ -531,6 +614,13 @@ msgid ""
"new attribute values. We might be tempted, for example to assign the "
"``first`` member like this::"
msgstr ""
"Contrairement au gestionnaire ``tp_new``, il n'y a aucune garantie que "
"``tp_init`` soit appelé (par exemple, le module :mod:`pickle` par défaut "
"n'appelle pas :meth:`__init__` sur les instances *unpickled*). Il peut "
"également être appelé plusieurs fois. N'importe qui peut appeler la méthode :"
"meth:`__init__` sur nos objets. Pour cette raison, nous devons être très "
"prudents lors de l'attribution des nouvelles valeurs d'attribut. On pourrait "
"être tenté, par exemple, d'affecter le membre ``first`` comme ceci ::"
#: extending/newtypes_tutorial.rst:416
msgid ""
@ -541,6 +631,12 @@ msgid ""
"interpreter Lock <GIL>` and let arbitrary code run in other threads that "
"accesses and modifies our object."
msgstr ""
"Mais ce serait risqué. Notre type ne limite pas le type du membre ``first``, "
"il peut donc s'agir de n'importe quel type d'objet. Il pourrait avoir un "
"destructeur qui provoque l'exécution de code essayant d'accéder au membre "
"``first`` ; ou ce destructeur pourrait libérer le :term:`Global interpreter "
"Lock <GIL>` et laisser du code arbitraire s'exécuter dans d'autres threads "
"qui accèdent et modifient notre objet."
#: extending/newtypes_tutorial.rst:423
msgid ""
@ -548,16 +644,22 @@ msgid ""
"always reassign members before decrementing their reference counts. When "
"don't we have to do this?"
msgstr ""
"Dans une optique paranoïaque et se prémunir contre cette éventualité, on "
"réaffecte presque toujours les membres avant de décrémenter leur compteur de "
"références. Quand ne devons-nous pas faire cela ?"
#: extending/newtypes_tutorial.rst:427
msgid "when we absolutely know that the reference count is greater than 1;"
msgstr ""
msgstr "lorsque l'on est sûr que le compteur de références est supérieur à 1 ;"
#: extending/newtypes_tutorial.rst:429
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 ""
"lorsque nous savons que la libération de la mémoire de l'objet [#]_ ne "
"libérera pas le :term:`GIL` ni ne provoquera de rappel dans le code de notre "
"type ;"
#: extending/newtypes_tutorial.rst:432
msgid ""
@ -565,17 +667,25 @@ msgid ""
"tp_dealloc` handler on a type which doesn't support cyclic garbage "
"collection [#]_."
msgstr ""
"lors de la décrémentation d'un compteur de références dans un gestionnaire :"
"c:member:`~PyTypeObject.tp_dealloc` sur un type qui ne prend pas en charge "
"le ramasse-miettes cyclique [#]_."
#: extending/newtypes_tutorial.rst:435
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 ""
"Nous voulons exposer nos variables d'instance en tant qu'attributs. Il "
"existe plusieurs façons de le faire. Le moyen le plus simple consiste à "
"définir des définitions de membres ::"
#: extending/newtypes_tutorial.rst:448
msgid ""
"and put the definitions in the :c:member:`~PyTypeObject.tp_members` slot::"
msgstr ""
"et placer les définitions dans l'emplacement :c:member:`~PyTypeObject."
"tp_members` ::"
#: extending/newtypes_tutorial.rst:452
msgid ""
@ -583,6 +693,9 @@ msgid ""
"documentation string. See the :ref:`Generic-Attribute-Management` section "
"below for details."
msgstr ""
"Chaque définition de membre possède un nom, un type, un décalage, des "
"indicateurs d'accès et une chaîne de documentation. Voir la section :ref:"
"`Generic-Attribute-Management` ci-dessous pour plus de détails."
#: extending/newtypes_tutorial.rst:456
msgid ""
@ -594,12 +707,22 @@ msgid ""
"``NULL`` values, the members can be set to ``NULL`` if the attributes are "
"deleted."
msgstr ""
"Un inconvénient de cette approche est qu'elle ne permet pas de restreindre "
"les types d'objets pouvant être affectés aux attributs Python. Nous nous "
"attendons à ce que le prénom et le nom soient des chaînes, mais tous les "
"objets Python peuvent être affectés. De plus, les attributs peuvent être "
"supprimés, en définissant les pointeurs C sur ``NULL``. Même si nous pouvons "
"nous assurer que les membres sont initialisés avec des valeurs non ``NULL``, "
"les membres peuvent être définis sur ``NULL`` si les attributs sont "
"supprimés."
#: extending/newtypes_tutorial.rst:463
msgid ""
"We define a single method, :meth:`Custom.name()`, that outputs the objects "
"name as the concatenation of the first and last names. ::"
msgstr ""
"Nous définissons une seule méthode, :meth:`Custom.name()`, qui génère le nom "
"des objets sous la forme de la concaténation des prénom et nom. ::"
#: extending/newtypes_tutorial.rst:480
msgid ""
@ -610,6 +733,13 @@ msgid ""
"to accept a positional argument tuple or keyword argument dictionary. This "
"method is equivalent to the Python method:"
msgstr ""
"La méthode est implémentée comme une fonction C qui prend une instance :"
"class:`Custom` (ou une sous-classe de :class:`Custom`) comme premier "
"argument. Les méthodes prennent toujours une instance comme premier "
"argument. Les méthodes prennent souvent aussi des arguments positionnels et "
"nommés, mais dans ce cas nous n'en prenons aucun et n'avons pas besoin "
"d'accepter un *n*-uplet d'arguments positionnels ou un dictionnaire en "
"argument nommé. Cette méthode est équivalente à la méthode Python :"
#: extending/newtypes_tutorial.rst:492
msgid ""
@ -619,22 +749,32 @@ msgid ""
"of these attributes and to restrict the attribute values to be strings. "
"We'll see how to do that in the next section."
msgstr ""
"Notez que nous devons vérifier la possibilité que nos membres :attr:`first` "
"et :attr:`last` soient ``NULL``. En effet, ils peuvent être supprimés, "
"auquel cas ils sont définis sur ``NULL``. Il serait préférable d'empêcher la "
"suppression de ces attributs et de limiter les valeurs d'attribut à des "
"chaînes. Nous verrons comment procéder dans la section suivante."
#: extending/newtypes_tutorial.rst:498
msgid ""
"Now that we've defined the method, we need to create an array of method "
"definitions::"
msgstr ""
"Maintenant que nous avons défini la méthode, nous devons créer un tableau de "
"définitions de méthode ::"
#: extending/newtypes_tutorial.rst:508
msgid ""
"(note that we used the :c:macro:`METH_NOARGS` flag to indicate that the "
"method is expecting no arguments other than *self*)"
msgstr ""
"(notez que nous avons utilisé le drapeau :c:macro:`METH_NOARGS` pour "
"indiquer que la méthode n'attend aucun argument autre que *self*)"
#: extending/newtypes_tutorial.rst:511
msgid "and assign it to the :c:member:`~PyTypeObject.tp_methods` slot::"
msgstr ""
"et assignons-le à l'emplacement :c:member:`~PyTypeObject.tp_methods` ::"
#: extending/newtypes_tutorial.rst:515
msgid ""
@ -643,6 +783,11 @@ msgid ""
"about the type of the object being created or used, so all we need to do is "
"to add the :c:macro:`Py_TPFLAGS_BASETYPE` to our class flag definition::"
msgstr ""
"Enfin, nous rendons notre type utilisable comme classe de base pour le sous-"
"classement. Nous avons écrit nos méthodes avec soin jusqu'à présent afin "
"qu'elles ne fassent aucune hypothèse sur le type de l'objet créé ou utilisé, "
"donc tout ce que nous avons à faire est d'ajouter la macro :c:macro:"
"`Py_TPFLAGS_BASETYPE` à notre définition d'indicateur de classe ::"
#: extending/newtypes_tutorial.rst:522
msgid ""
@ -650,14 +795,19 @@ msgid ""
"module name in the :c:type:`PyModuleDef` struct, and update the full class "
"name in the :c:type:`PyTypeObject` struct."
msgstr ""
"Nous renommons :c:func:`PyInit_custom` en :c:func:`PyInit_custom2`, mettons "
"à jour le nom du module dans la structure :c:type:`PyModuleDef` et mettons à "
"jour le nom complet de la classe dans la structure :c:type:`PyTypeObject`."
#: extending/newtypes_tutorial.rst:526
msgid "Finally, we update our :file:`setup.py` file to build the new module:"
msgstr ""
"Enfin, nous mettons à jour notre fichier :file:`setup.py` pour construire le "
"nouveau module :"
#: extending/newtypes_tutorial.rst:539
msgid "Providing finer control over data attributes"
msgstr ""
msgstr "Contrôle précis sur les attributs de données"
#: extending/newtypes_tutorial.rst:541
msgid ""
@ -667,6 +817,12 @@ msgid ""
"attr:`last` could be set to non-string values or even deleted. We want to "
"make sure that these attributes always contain strings."
msgstr ""
"Dans cette section, nous assurons un contrôle plus précis sur la façon dont "
"les attributs :attr:`first` et :attr:`last` sont définis dans l'exemple :"
"class:`Custom`. Dans la version précédente de notre module, les variables "
"d'instance :attr:`first` et :attr:`last` pouvaient être définies sur des "
"valeurs autres que des chaînes ou même supprimées. Nous voulons nous assurer "
"que ces attributs contiennent toujours des chaînes."
#: extending/newtypes_tutorial.rst:550
msgid ""
@ -674,6 +830,10 @@ msgid ""
"attributes, we'll use custom getter and setter functions. Here are the "
"functions for getting and setting the :attr:`first` attribute::"
msgstr ""
"Pour avoir un meilleur contrôle sur les attributs :attr:`first` et :attr:"
"`last`, nous utilisons des fonctions accesseur (*getter*) et mutateur "
"(*setter*) personnalisées. Voici les fonctions pour obtenir et définir "
"l'attribut :attr:`first` ::"
#: extending/newtypes_tutorial.rst:581
msgid ""
@ -684,6 +844,13 @@ msgid ""
"getter and setter functions that decide the attribute to get or set based on "
"data in the closure.)"
msgstr ""
"L'accesseur reçoit un objet :class:`Custom` et une fermeture qui est un "
"pointeur vide. Dans ce cas, la fermeture est ignorée. (La fermeture prend en "
"charge une utilisation avancée dans laquelle les données de définition sont "
"transmises à l'accesseur et au mutateur. Cela pourrait, par exemple, être "
"utilisé pour autoriser un seul ensemble de fonctions accesseur et mutateur "
"qui décident de l'attribut à obtenir ou à définir en fonction des données "
"dans la fermeture.)"
#: extending/newtypes_tutorial.rst:587
msgid ""
@ -692,14 +859,19 @@ msgid ""
"being deleted. In our setter, we raise an error if the attribute is deleted "
"or if its new value is not a string."
msgstr ""
"Le mutateur reçoit l'objet :class:`Custom`, la nouvelle valeur et la "
"fermeture. La nouvelle valeur peut être ``NULL``, auquel cas l'attribut est "
"supprimé. Dans notre mutateur, nous levons une erreur si l'attribut est "
"supprimé ou si sa nouvelle valeur n'est pas une chaîne."
#: extending/newtypes_tutorial.rst:592
msgid "We create an array of :c:type:`PyGetSetDef` structures::"
msgstr ""
msgstr "Nous créons un tableau de structures :c:type:`PyGetSetDef` ::"
#: extending/newtypes_tutorial.rst:602
msgid "and register it in the :c:member:`~PyTypeObject.tp_getset` slot::"
msgstr ""
"et l'enregistrons dans l'emplacement :c:member:`~PyTypeObject.tp_getset` ::"
#: extending/newtypes_tutorial.rst:606
msgid ""
@ -707,16 +879,22 @@ msgid ""
"mentioned above. In this case, we aren't using a closure, so we just pass "
"``NULL``."
msgstr ""
"Le dernier élément d'une structure :c:type:`PyGetSetDef` est la fermeture "
"mentionnée ci-dessus. Dans ce cas, nous n'utilisons pas de fermeture, nous "
"passons donc simplement ``NULL``."
#: extending/newtypes_tutorial.rst:609
msgid "We also remove the member definitions for these attributes::"
msgstr ""
"Nous supprimons également les définitions de membre pour ces attributs :"
#: extending/newtypes_tutorial.rst:617
msgid ""
"We also need to update the :c:member:`~PyTypeObject.tp_init` handler to only "
"allow strings [#]_ to be passed::"
msgstr ""
"Nous devons également mettre à jour le gestionnaire :c:member:`~PyTypeObject."
"tp_init` pour autoriser uniquement le passage des chaînes [#]_ ::"
#: extending/newtypes_tutorial.rst:646
msgid ""
@ -727,6 +905,13 @@ msgid ""
"these calls is in the ``tp_dealloc`` implementation, where there is the "
"possibility that the initialization of these members failed in ``tp_new``."
msgstr ""
"Avec ces modifications, nous pouvons garantir que les membres ``first`` et "
"``last`` ne sont jamais ``NULL``, nous pouvons donc supprimer les "
"vérifications des valeurs ``NULL`` dans presque tous les cas. Cela signifie "
"que la plupart des appels :c:func:`Py_XDECREF` peuvent être convertis en "
"appels :c:func:`Py_DECREF`. Le seul endroit où nous ne pouvons pas modifier "
"ces appels est dans l'implémentation de ``tp_dealloc``, où il est possible "
"que l'initialisation de ces membres ait échoué dans ``tp_new``."
#: extending/newtypes_tutorial.rst:653
msgid ""
@ -734,10 +919,14 @@ msgid ""
"initialization function, as we did before, and we add an extra definition to "
"the :file:`setup.py` file."
msgstr ""
"Nous renommons également la fonction d'initialisation du module et le nom du "
"module dans la fonction d'initialisation, comme nous l'avons fait "
"précédemment, et nous ajoutons une définition supplémentaire au fichier :"
"file:`setup.py`."
#: extending/newtypes_tutorial.rst:659
msgid "Supporting cyclic garbage collection"
msgstr ""
msgstr "Prise en charge du ramasse-miettes cyclique"
#: extending/newtypes_tutorial.rst:661
msgid ""
@ -745,6 +934,10 @@ msgid ""
"can identify unneeded objects even when their reference counts are not zero. "
"This can happen when objects are involved in cycles. For example, consider:"
msgstr ""
"Python a un :term:`ramasse-miettes cyclique <garbage collection>` qui peut "
"identifier les objets inutiles même lorsque leur compteur de références "
"n'est pas nul. Cela peut se produire lorsque des objets sont impliqués dans "
"des cycles. Par exemple, considérons :"
#: extending/newtypes_tutorial.rst:671
msgid ""
@ -753,6 +946,11 @@ msgid ""
"zero. Fortunately, Python's cyclic garbage collector will eventually figure "
"out that the list is garbage and free it."
msgstr ""
"Dans cet exemple, nous créons une liste qui se contient elle-même. Lorsque "
"nous la supprimons, il existe toujours une référence à elle-même. Son "
"compteur de références ne tombe pas à zéro. Heureusement, le ramasse-miettes "
"cyclique de Python finira par comprendre que la liste est un déchet et la "
"libérera."
#: extending/newtypes_tutorial.rst:676
msgid ""
@ -762,6 +960,12 @@ msgid ""
"`Custom`, and subclasses may add arbitrary attributes. For any of those two "
"reasons, :class:`Custom` objects can participate in cycles:"
msgstr ""
"Dans la seconde version de l'exemple :class:`Custom`, nous avons autorisé le "
"stockage de n'importe quel type d'objet dans les attributs :attr:`first` ou :"
"attr:`last` [#]_. De plus, dans les deuxième et troisième versions, nous "
"avons autorisé le sous-classement de :class:`Custom`, et les sous-classes "
"peuvent ajouter des attributs arbitraires. Pour l'une de ces deux raisons, "
"les objets :class:`Custom` peuvent produire des cycles :"
#: extending/newtypes_tutorial.rst:690
msgid ""
@ -770,12 +974,19 @@ msgid ""
"needs to fill two additional slots and to enable a flag that enables these "
"slots:"
msgstr ""
"Pour permettre à une instance :class:`Custom` participant à des références "
"cycliques d'être correctement détectée et collectée par le ramasse-miettes "
"cyclique, notre type :class:`Custom` doit définir deux emplacements "
"supplémentaires et activer un drapeau qui active ces emplacements :"
#: extending/newtypes_tutorial.rst:697
msgid ""
"First, the traversal method lets the cyclic GC know about subobjects that "
"could participate in cycles::"
msgstr ""
"Tout d'abord, la méthode de parcours (*Custom_traverse*) permet au ramasse-"
"miettes cyclique de connaître les sous-objets qui pourraient conduire à des "
"cycles ::"
#: extending/newtypes_tutorial.rst:717
msgid ""
@ -785,6 +996,11 @@ msgid ""
"*arg* passed to the traversal method. It returns an integer value that must "
"be returned if it is non-zero."
msgstr ""
"Pour chaque sous-objet pouvant conduire à des cycles, nous devons appeler la "
"fonction :c:func:`visit`, qui est passée à la méthode de parcours. La "
"fonction :c:func:`visit` prend comme arguments le sous-objet et l'argument "
"supplémentaire *arg* passé à la méthode de parcours. Elle renvoie une valeur "
"entière qui doit être renvoyée si elle est différente de zéro."
#: extending/newtypes_tutorial.rst:723
msgid ""
@ -792,18 +1008,26 @@ msgid ""
"functions. With :c:func:`Py_VISIT`, we can minimize the amount of "
"boilerplate in ``Custom_traverse``::"
msgstr ""
"Python fournit une macro :c:func:`Py_VISIT` qui automatise l'appel des "
"fonctions de visite. Avec :c:func:`Py_VISIT`, nous pouvons minimiser la "
"quantité de code générique dans ``Custom_traverse`` ::"
# suit un :
#: extending/newtypes_tutorial.rst:736
msgid ""
"The :c:member:`~PyTypeObject.tp_traverse` implementation must name its "
"arguments exactly *visit* and *arg* in order to use :c:func:`Py_VISIT`."
msgstr ""
"l'implémentation :c:member:`~PyTypeObject.tp_traverse` doit nommer ses "
"arguments exactement *visit* et *arg* afin d'utiliser :c:func:`Py_VISIT`."
#: extending/newtypes_tutorial.rst:739
msgid ""
"Second, we need to provide a method for clearing any subobjects that can "
"participate in cycles::"
msgstr ""
"Deuxièmement, nous devons fournir une méthode pour effacer tous les sous-"
"objets qui peuvent conduire à des cycles ::"
#: extending/newtypes_tutorial.rst:750
msgid ""
@ -814,10 +1038,17 @@ msgid ""
"attribute's destructor would call back into code that reads the attribute "
"again (*especially* if there is a reference cycle)."
msgstr ""
"Notez l'utilisation de la macro :c:func:`Py_CLEAR`. C'est le moyen "
"recommandé et sûr d'effacer les attributs de données de types arbitraires "
"tout en décrémentant leur compteur de références. Si vous deviez appeler :c:"
"func:`Py_XDECREF` à la place sur l'attribut avant de le définir sur "
"``NULL``, il est possible que le destructeur de l'attribut appelle du code "
"qui lit à nouveau l'attribut (*surtout* s'il existe un cycle de références)."
# suit un :
#: extending/newtypes_tutorial.rst:758
msgid "You could emulate :c:func:`Py_CLEAR` by writing::"
msgstr ""
msgstr "vous pouvez émuler :c:func:`Py_CLEAR` en écrivant ::"
#: extending/newtypes_tutorial.rst:765
msgid ""
@ -825,6 +1056,9 @@ msgid ""
"`Py_CLEAR` when deleting an attribute. Don't try to micro-optimize at the "
"expense of robustness!"
msgstr ""
"Néanmoins, il est beaucoup plus facile et moins sujet aux erreurs de "
"toujours utiliser :c:func:`Py_CLEAR` lors de la suppression d'un attribut. "
"N'essayez pas de micro-optimiser au détriment de la robustesse !"
#: extending/newtypes_tutorial.rst:769
msgid ""
@ -835,11 +1069,21 @@ msgid ""
"members. Here is our reimplemented deallocator using :c:func:"
"`PyObject_GC_UnTrack` and ``Custom_clear``::"
msgstr ""
"La fonction de libération de la mémoire ``Custom_dealloc`` peut appeler du "
"code arbitraire lors de la suppression des attributs. Cela signifie que le "
"ramasse-miettes cyclique peut être déclenché à l'intérieur de la fonction. "
"Étant donné que le ramasse-miettes suppose que le nombre de références n'est "
"pas nul, nous devons annuler le suivi de l'objet par le ramasse-miettes en "
"appelant :c:func:`PyObject_GC_UnTrack` avant d'effacer les membres. Voici "
"notre fonction de libération de la mémoire réimplémentée en utilisant :c:"
"func:`PyObject_GC_UnTrack` et ``Custom_clear`` ::"
#: extending/newtypes_tutorial.rst:784
msgid ""
"Finally, we add the :c:macro:`Py_TPFLAGS_HAVE_GC` flag to the class flags::"
msgstr ""
"Enfin, nous ajoutons le drapeau :c:macro:`Py_TPFLAGS_HAVE_GC` aux drapeaux "
"de la classe ::"
#: extending/newtypes_tutorial.rst:788
msgid ""
@ -848,10 +1092,14 @@ msgid ""
"them for cyclic garbage collection. Most extensions will use the versions "
"automatically provided."
msgstr ""
"C'est à peu près tout. Si nous avions écrit des gestionnaires personnalisés :"
"c:member:`~PyTypeObject.tp_alloc` ou :c:member:`~PyTypeObject.tp_free`, nous "
"aurions besoin de les modifier pour le ramasse-miettes cyclique. La plupart "
"des extensions utilisent les versions fournies automatiquement."
#: extending/newtypes_tutorial.rst:794
msgid "Subclassing other types"
msgstr ""
msgstr "Sous-classement d'autres types"
#: extending/newtypes_tutorial.rst:796
msgid ""
@ -860,6 +1108,11 @@ msgid ""
"can easily use the :c:type:`PyTypeObject` it needs. It can be difficult to "
"share these :c:type:`PyTypeObject` structures between extension modules."
msgstr ""
"Il est possible de créer de nouveaux types d'extension dérivés de types "
"existants. Il est plus facile d'hériter des types natifs, car une extension "
"peut facilement utiliser le :c:type:`PyTypeObject` dont elle a besoin. Il "
"peut être difficile de partager ces structures :c:type:`PyTypeObject` entre "
"modules d'extension."
#: extending/newtypes_tutorial.rst:801
msgid ""
@ -868,6 +1121,10 @@ msgid ""
"with regular lists, but will have an additional :meth:`increment` method "
"that increases an internal counter:"
msgstr ""
"Dans cet exemple, nous allons créer un type :class:`SubList` qui hérite du "
"type intégré :class:`list`. Le nouveau type sera complètement compatible "
"avec les listes natives, mais aura une méthode supplémentaire :meth:"
"`increment` qui augmente un compteur interne :"
#: extending/newtypes_tutorial.rst:821
msgid ""
@ -875,6 +1132,9 @@ msgid ""
"examples in previous sections. We will break down the main differences "
"between them. ::"
msgstr ""
"Comme vous pouvez le voir, le code source ressemble beaucoup aux exemples :"
"class:`Custom` des sections précédentes. Analysons les principales "
"différences ::"
#: extending/newtypes_tutorial.rst:829
msgid ""
@ -882,6 +1142,9 @@ msgid ""
"object structure must be the first value. The base type will already "
"include the :c:func:`PyObject_HEAD` at the beginning of its structure."
msgstr ""
"La principale différence pour les objets d'un type dérivé est que la "
"structure d'objet du type père doit être la première valeur. Le type père "
"inclut déjà le :c:func:`PyObject_HEAD` au début de sa structure."
#: extending/newtypes_tutorial.rst:833
msgid ""
@ -889,12 +1152,17 @@ msgid ""
"pointer can be safely cast to both ``PyListObject *`` and ``SubListObject "
"*``::"
msgstr ""
"Lorsqu'un objet Python est une instance de :class:`SubList`, son pointeur "
"``PyObject *`` peut être trans-typé en toute sécurité vers ``PyListObject "
"*`` et ``SubListObject *`` ::"
#: extending/newtypes_tutorial.rst:845
msgid ""
"We see above how to call through to the :attr:`__init__` method of the base "
"type."
msgstr ""
"Nous voyons ci-dessus comment appeler la méthode :attr:`__init__` du type "
"père."
#: extending/newtypes_tutorial.rst:848
msgid ""
@ -904,6 +1172,12 @@ msgid ""
"memory for the object with its :c:member:`~PyTypeObject.tp_alloc`, but let "
"the base class handle it by calling its own :c:member:`~PyTypeObject.tp_new`."
msgstr ""
"Ce modèle est important lors de l'écriture d'un type avec des membres "
"personnalisés :c:member:`~PyTypeObject.tp_new` et :c:member:`~PyTypeObject."
"tp_dealloc`. Le gestionnaire :c:member:`~PyTypeObject.tp_new` ne doit pas "
"réellement allouer la mémoire pour l'objet avec son :c:member:`~PyTypeObject."
"tp_alloc`, mais laisser la classe mère gérer ça en appelant sa propre :c:"
"member:`~PyTypeObject.tp_new`."
#: extending/newtypes_tutorial.rst:854
msgid ""
@ -913,6 +1187,11 @@ msgid ""
"type:`PyList_Type`; it should be done later in the module initialization "
"function::"
msgstr ""
"La structure :c:type:`PyTypeObject` prend en charge un :c:member:"
"`~PyTypeObject.tp_base` spécifiant la classe mère concrète du type. En "
"raison de problèmes de compilateur multiplateformes, vous ne pouvez pas "
"remplir ce champ directement avec une référence à :c:type:`PyList_Type` ; "
"cela doit être fait plus tard dans la fonction d'initialisation du module ::"
#: extending/newtypes_tutorial.rst:882
msgid ""
@ -922,12 +1201,19 @@ msgid ""
"tp_alloc` slot with :c:func:`PyType_GenericNew` -- the allocation function "
"from the base type will be inherited."
msgstr ""
"Avant d'appeler :c:func:`PyType_Ready`, la structure de type doit avoir "
"l'emplacement :c:member:`~PyTypeObject.tp_base` rempli. Lorsque nous "
"dérivons un type existant, il n'est pas nécessaire de remplir l'emplacement :"
"c:member:`~PyTypeObject.tp_alloc` avec :c:func:`PyType_GenericNew` la "
"fonction d'allocation du type père sera héritée."
#: extending/newtypes_tutorial.rst:888
msgid ""
"After that, calling :c:func:`PyType_Ready` and adding the type object to the "
"module is the same as with the basic :class:`Custom` examples."
msgstr ""
"Ensuite, appeler :c:func:`PyType_Ready` et ajouter l'objet type au module se "
"fait de la même manière qu'avec les exemples de base :class:`Custom`."
#: extending/newtypes_tutorial.rst:893
msgid "Footnotes"
@ -938,12 +1224,17 @@ msgid ""
"This is true when we know that the object is a basic type, like a string or "
"a float."
msgstr ""
"C'est vrai lorsque nous savons que l'objet est un type de base, comme une "
"chaîne ou un flottant."
#: extending/newtypes_tutorial.rst:897
msgid ""
"We relied on this in the :c:member:`~PyTypeObject.tp_dealloc` handler in "
"this example, because our type doesn't support garbage collection."
msgstr ""
"Nous nous sommes appuyés sur le gestionnaire :c:member:`~PyTypeObject."
"tp_dealloc` dans cet exemple, car notre type ne prend pas en charge le "
"ramasse-miettes."
#: extending/newtypes_tutorial.rst:900
msgid ""
@ -954,6 +1245,13 @@ msgid ""
"deallocating an instance of a string subclass won't call back into our "
"objects."
msgstr ""
"Nous savons maintenant que les premier et dernier membres sont des chaînes, "
"nous pourrions donc peut-être être moins prudents quant à la décrémentation "
"de leur nombre de références, cependant, nous acceptons les instances de "
"sous-classes de chaînes. Même si la libération de la mémoire des chaînes "
"normales ne rappellera pas nos objets, nous ne pouvons pas garantir que la "
"libération de mémoire d'une instance d'une sous-classe de chaîne ne "
"rappellera pas nos objets."
#: extending/newtypes_tutorial.rst:906
msgid ""
@ -961,3 +1259,6 @@ msgid ""
"could pass arbitrary :class:`str` subclasses and therefore still create "
"reference cycles."
msgstr ""
"De plus, même avec nos attributs limités aux instances de chaînes, "
"l'utilisateur pourrait passer des sous-classes arbitraires :class:`str` et "
"donc encore créer des références cycliques."