diff --git a/extending/extending.po b/extending/extending.po index 0f59cbaa..cd580e4c 100644 --- a/extending/extending.po +++ b/extending/extending.po @@ -6,14 +6,14 @@ msgstr "" "Project-Id-Version: Python 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 09:01+0200\n" -"PO-Revision-Date: 2019-10-30 00:03+0100\n" +"PO-Revision-Date: 2021-02-07 22:27+0100\n" "Last-Translator: Julien Palard \n" "Language-Team: FRENCH \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 2.2.3\n" +"X-Generator: Poedit 2.3\n" #: extending/extending.rst:8 msgid "Extending Python with C or C++" @@ -28,9 +28,9 @@ msgid "" msgstr "" "Il est relativement facile d'ajouter de nouveaux modules à Python, si vous " "savez programmer en C. Ces :dfn:` extension modules` " -"permettent deux choses qui ne sont pas possible directement en Python: Elles " -"peuvent définir de nouveaux types natifs, et peuvent appeler des fonctions " -"de bibliothèques C ou appels systèmes." +"permettent deux choses qui ne sont pas possibles directement en Python : " +"Elles peuvent définir de nouveaux types natifs, et peuvent appeler des " +"fonctions de bibliothèques C ou faire des appels systèmes." #: extending/extending.rst:15 msgid "" @@ -65,15 +65,15 @@ msgid "" "with C code and are more portable between implementations of Python than " "writing and compiling a C extension module." msgstr "" -"L'interface d'extension C est spécifique à CPython, et les modules " +"L'interface d'extension C est spécifique à *CPython*, et les modules " "d'extension ne fonctionne pas sur les autres implémentations de Python. Dans " "de nombreux cas, il est possible d'éviter la rédaction des extensions en C " "et ainsi préserver la portabilité vers d'autres implémentations. Par " "exemple, si vous devez appeler une fonction de la bibliothèque C ou faire un " "appel système, vous devriez envisager d'utiliser le module :mod:`ctypes` ou " -"d'utiliser la bibliothèque `cffi `_ plutôt que " -"d'écrire du code C sur mesure. Ces modules vous permettent d'écrire du code " -"Python s'interfaçant avec le code C et sont plus portables entre les " +"d'utiliser la bibliothèque `*cffi* `_ plutôt " +"que d'écrire du code C sur mesure. Ces modules vous permettent d'écrire du " +"code Python s'interfaçant avec le code C et sont plus portables entre les " "implémentations de Python que l'écriture et la compilation d'une d'extension " "C." @@ -90,9 +90,9 @@ msgid "" "this function to be callable from Python as follows:" msgstr "" "Créons un module d'extension appelé ``spam`` (la nourriture préférée de fans " -"des Monty Python ...) et disons que nous voulons créer une interface Python " +"des *Monty Python* …) et disons que nous voulons créer une interface Python " "à la fonction de la bibliothèque C :c:func:`system` [#]_. Cette fonction " -"prend une chaîne de caractères terminée par NULL comme argument et renvoie " +"prend une chaîne de caractères à terminaison nulle comme argument et renvoie " "un entier. Nous voulons que cette fonction soit appelable à partir de Python " "comme suit :" @@ -152,7 +152,7 @@ msgstr "" "Tous les symboles exposés par :file:`Python.h` sont préfixés de ``Py`` ou " "``PY``, sauf ceux qui sont définis dans les en-têtes standard. Pour le " "confort, et comme ils sont largement utilisés par l'interpréteur Python, ``" -"\"Python.h\"`` inclut lui même quelques d'en-têtes standard : ````, " +"\"Python.h\"`` inclut lui-même quelques d'en-têtes standard : ````, " "````, ```` et ````. Si ce dernier n'existe pas " "sur votre système, il déclare les fonctions :c:func:`malloc`, :c:func:`free` " "et :c:func:`realloc` directement." @@ -201,16 +201,15 @@ msgid "" msgstr "" "L'argument *args* sera un pointeur vers un *n*-uplet Python contenant les " "arguments. Chaque élément du *n*-uplet correspond à un argument dans la " -"liste des arguments de l'appel. Les arguments sont des objets Python --- " -"afin d'en faire quelque chose dans notre fonction C, nous devons les " -"convertir en valeurs C. La fonction :c:func:`PyArg_ParseTuple` de l'API " -"Python vérifie les types des arguments et les convertit en valeurs C. Elle " -"utilise un modèle sous forme de chaîne pour déterminer les types requis des " -"arguments ainsi que les types de variables C dans lequel stocker les valeurs " +"liste des arguments de l'appel. Les arguments sont des objets Python, afin " +"d'en faire quelque chose dans notre fonction C, nous devons les convertir en " +"valeurs C. La fonction :c:func:`PyArg_ParseTuple` de l'API Python vérifie " +"les types des arguments et les convertit en valeurs C. Elle utilise un " +"modèle sous forme de chaîne pour déterminer les types requis des arguments " +"ainsi que les types de variables C dans lequel stocker les valeurs " "converties. Nous en verront plus, plus tard." #: extending/extending.rst:116 -#, fuzzy msgid "" ":c:func:`PyArg_ParseTuple` returns true (nonzero) if all arguments have the " "right type and its components have been stored in the variables whose " @@ -221,17 +220,16 @@ msgid "" msgstr "" ":c:func:`PyArg_ParseTuple` renvoie vrai (pas zéro) si tous les arguments ont " "le bon type et que ses composants ont été stockés dans les variables dont " -"les adresses données. Il renvoie faux (zéro) si une liste d'arguments " -"invalide a été passée. Dans ce dernier cas, elle lève également une " -"exception appropriée de sorte que la fonction d'appel puisse renvoyer *NULL* " -"immédiatement (comme nous l'avons vu dans l'exemple)." +"les adresses ont été données en entrée. Il renvoie faux (zéro) si une liste " +"d'arguments invalide a été passée. Dans ce dernier cas, elle lève également " +"une exception appropriée de sorte que la fonction d'appel puisse renvoyer " +"``NULL`` immédiatement (comme nous l'avons vu dans l'exemple)." #: extending/extending.rst:126 msgid "Intermezzo: Errors and Exceptions" -msgstr "Intermezzo: Les erreurs et exceptions" +msgstr "Intermezzo : Les erreurs et les exceptions" #: extending/extending.rst:128 -#, fuzzy msgid "" "An important convention throughout the Python interpreter is the following: " "when a function fails, it should set an exception condition and return an " @@ -245,11 +243,11 @@ msgid "" "Library Reference). It is important to know about them to understand how " "errors are passed around." msgstr "" -"Une convention primordiale imprégnant tout l'interpréteur Python est: quand " +"Une convention primordiale imprégnant tout l'interpréteur Python est : quand " "une fonction échoue, elle devrait laisser une exception et renvoyer une " -"valeur d'erreur (typiquement un pointeur *NULL*). Dans l'interpréteur, les " -"exceptions sont stockés dans une variable globale statique, si cette " -"variable est *NULL*, aucune exception n'a eu lieu. Une seconde variable " +"valeur d'erreur (typiquement un pointeur ``NULL``). Dans l'interpréteur, les " +"exceptions sont stockées dans une variable globale statique, si cette " +"variable est ``NULL``, aucune exception n'a eu lieu. Une seconde variable " "globale stocke la \"valeur associée\" à l'exception (le deuxième argument " "de :keyword:`raise`). Une troisième variable contient la trace de la pile " "dans le cas où l'erreur soit survenue dans du code Python. Ces trois " @@ -292,11 +290,10 @@ msgstr "" "Une autre fonction utile est :c:func:`PyErr_SetFromErrno`, qui construit une " "exception à partir de la valeur de la variable globale :c:data:`errno`. La " "fonction la plus générale est :c:func:`PyErr_SetObject`, qui prend deux " -"arguments: l'exception et sa valeur associée. Vous ne devez pas appliquer :c:" -"func:`Py_INCREF` aux objets transmis à ces fonctions." +"arguments : l'exception et sa valeur associée. Vous ne devez pas appliquer :" +"c:func:`Py_INCREF` aux objets transmis à ces fonctions." #: extending/extending.rst:154 -#, fuzzy msgid "" "You can test non-destructively whether an exception has been set with :c:" "func:`PyErr_Occurred`. This returns the current exception object, or " @@ -306,10 +303,10 @@ msgid "" msgstr "" "Vous pouvez tester de manière non destructive si une exception a été levée " "avec :c:func:`PyErr_Occurred`. Cela renvoie l'objet exception actuel, ou " -"*NULL* si aucune exception n'a eu lieu. Cependant, vous ne devriez pas avoir " -"besoin d'appeler :c:func:`PyErr_Occurred` pour voir si une erreur est " +"``NULL`` si aucune exception n'a eu lieu. Cependant, vous ne devriez pas " +"avoir besoin d'appeler :c:func:`PyErr_Occurred` pour voir si une erreur est " "survenue durant l'appel d'une fonction, puisque vous devriez être en mesure " -"de le déterminer à partir de la valeur de retour." +"de le déterminer à partir de la valeur renvoyée." #: extending/extending.rst:160 #, fuzzy @@ -327,15 +324,15 @@ msgid "" msgstr "" "Lorsqu'une fonction *f* ayant appelé une autre fonction *g* détecte que " "cette dernière a échoué, *f* devrait donner une valeur d'erreur à son tour " -"(habituellement *NULL* ou ``-1``). *f* ne devrait *pas* appeler l'une des " -"fonctions :c:func:`PyErr_\\*`, l'une d'elles ayant déjà été appelée par *g*. " -"La fonction appelant *f* est alors censée renvoyer aussi un code d'erreur à " -"celle qui l'a appelée, toujours sans utiliser :c:func:`PyErr_\\*`, et ainsi " -"de suite. La cause la plus détaillée de l'erreur a déjà été signalée par la " -"fonction l'ayant détectée en premier. Une fois l'erreur remontée à la boucle " -"principale de l'interpréteur Python, il interrompt le code en cours " -"d'exécution et essaie de trouver un gestionnaire d'exception spécifié par le " -"développeur Python." +"(habituellement ``NULL`` ou ``-1``). La fonction *f* ne devrait *pas* " +"appeler l'une des fonctions :c:func:`PyErr_\\*`, l'une d'entre elles ayant " +"déjà été appelée par *g*. La fonction appelant *f* est alors censée renvoyer " +"aussi un code d'erreur à celle qui l'a appelée, toujours sans utiliser :c:" +"func:`PyErr_\\*`, et ainsi de suite. La cause la plus détaillée de l'erreur " +"a déjà été signalée par la fonction l'ayant détecté en premier. Une fois " +"l'erreur remontée à la boucle principale de l'interpréteur Python, il " +"interrompt le code en cours d'exécution et essaie de trouver un gestionnaire " +"d'exception spécifié par le développeur Python." #: extending/extending.rst:170 msgid "" @@ -349,8 +346,8 @@ msgstr "" "d'erreur plus détaillé en appelant une autre fonction :c:func:`PyErr_\\*`, " "dans de tels cas, il est tout à fait possible de le faire. Cependant, ce " "n'est généralement pas nécessaire, et peut amener à perdre des informations " -"sur la cause de l'erreur: la plupart des opérations peuvent échouer pour " -"tout un tas de raisons)." +"sur la cause de l'erreur : la plupart des opérations peuvent échouer pour " +"tout un tas de raisons.)" #: extending/extending.rst:176 msgid "" @@ -375,7 +372,7 @@ msgid "" "creating functions (for example, :c:func:`PyLong_FromLong`) already do this, " "so this note is only relevant to those who call :c:func:`malloc` directly." msgstr "" -"Chaque échec de :c:func:`malloc` doit être transformé en une exception --- " +"Chaque échec de :c:func:`malloc` doit être transformé en une exception, " "l'appelant direct de :c:func:`malloc` (ou :c:func:`realloc`) doit appeler :c:" "func:`PyErr_NoMemory` et prendre l'initiative de renvoyer une valeur " "d'erreur. Toutes les fonctions construisant des objets (tels que :c:func:" @@ -402,7 +399,7 @@ msgid "" msgstr "" "Enfin, lorsque vous renvoyez un code d'erreur, n'oubliez pas faire un brin " "de nettoyage (en appelant :c:func:`Py_XDECREF` ou :c:func:`Py_DECREF` avec " -"les objets que vous auriez déjà créés) !" +"les objets que vous auriez déjà créés) !" #: extending/extending.rst:196 msgid "" @@ -445,17 +442,16 @@ msgstr "" "`PyInit_spam`) avec un objet exception ::" #: extending/extending.rst:235 -#, fuzzy msgid "" "Note that the Python name for the exception object is :exc:`spam.error`. " "The :c:func:`PyErr_NewException` function may create a class with the base " "class being :exc:`Exception` (unless another class is passed in instead of " "``NULL``), described in :ref:`bltin-exceptions`." msgstr "" -"Notez que le nom de exception, côté Python, est :exc:`spam.error`. La " +"Notez que le nom de l'exception en Python est :exc:`spam.error`. La " "fonction :c:func:`PyErr_NewException` peut créer une classe héritant de :exc:" "`Exception` (à moins qu'une autre classe ne lui soit fournie à la place de " -"*NULL*), voir :ref:`bltin-exceptions`." +"``NULL``), voir :ref:`bltin-exceptions`." #: extending/extending.rst:240 msgid "" @@ -468,12 +464,12 @@ msgid "" "unintended side effects." msgstr "" "Notez également que la variable :c:data:`SpamError` contient une référence à " -"la nouvelle classe créée; ceci est intentionnel! Comme l'exception peut être " -"retirée du module par un code externe, une référence à la classe est " +"la nouvelle classe créée ; ceci est intentionnel ! Comme l'exception peut " +"être retirée du module par un code externe, une référence à la classe est " "nécessaire pour assurer qu'il ne sera pas rejeté, causant :c:data:" -"`SpamError` à devenir un pointeur défaillant. S'il devenait un pointeur " -"défaillant, le C code qui lève l'exception peut engendrer un rejet central " -"ou des effets secondaires inattendus." +"`SpamError` et devenir un pointeur défaillant. Si cela se produirait, le C " +"code qui lève cette exception peut engendrer un *core dump* ou des effets " +"secondaires inattendus." #: extending/extending.rst:247 msgid "" @@ -481,7 +477,7 @@ msgid "" "this sample." msgstr "" "Nous traiterons de l'utilisation de ``PyMODINIT_FUNC`` comme un type de " -"retour de fonction plus tard dans cette section." +"renvoi de fonction plus tard dans cette section." #: extending/extending.rst:250 msgid "" @@ -504,7 +500,6 @@ msgstr "" "capable de comprendre cette affirmation ::" #: extending/extending.rst:281 -#, fuzzy msgid "" "It returns ``NULL`` (the error indicator for functions returning object " "pointers) if an error is detected in the argument list, relying on the " @@ -514,14 +509,14 @@ msgid "" "which it points (so in Standard C, the variable :c:data:`command` should " "properly be declared as ``const char *command``)." msgstr "" -"Elle renvoie *NULL* (l'indicateur d'erreur pour les fonctions renvoyant des " -"pointeurs d'objet) si une erreur est détectée dans la liste des arguments,se " -"fiant à l'exception définie par :c:func:`PyArg_ParseTuple`. Autrement,la " -"valeur chaîne de l'argument a été copiée dans la variable locale :c:data:" -"`command`. Il s'agit d'une attribution de pointeur et vous n'êtes pas " -"supposés modifier la chaîne qui vers laquelle il pointe (donc en C Standard, " -"la variable :c:data:`command` doit être clairement déclarée comme ``const " -"char *command``)." +"Elle renvoie ``NULL`` (l'indicateur d'erreur pour les fonctions renvoyant " +"des pointeurs d'objet) si une erreur est détectée dans la liste des " +"arguments, se fiant à l'exception définie par :c:func:`PyArg_ParseTuple`. " +"Autrement, la valeur chaîne de l'argument a été copiée dans la variable " +"locale :c:data:`command`. Il s'agit d'une attribution de pointeur et vous " +"n'êtes pas supposés modifier la chaîne vers laquelle il pointe (donc en C " +"Standard, la variable :c:data:`command` doit être clairement déclarée comme " +"``const char *command``)." #: extending/extending.rst:289 msgid "" @@ -547,7 +542,7 @@ msgid "" "objects on the heap in Python!)" msgstr "" "Dans ce cas, elle renverra un objet entier. (Oui, même les entiers sont des " -"objets dans le tas en Python!)" +"objets dans le tas en Python !)" #: extending/extending.rst:302 msgid "" @@ -562,16 +557,15 @@ msgstr "" "implémentée par la macro :c:macro:`Py_RETURN_NONE`) ::" #: extending/extending.rst:310 -#, fuzzy msgid "" ":c:data:`Py_None` is the C name for the special Python object ``None``. It " "is a genuine Python object rather than a ``NULL`` pointer, which means " "\"error\" in most contexts, as we have seen." msgstr "" -":c:data:`Py_None` est le nom C pour l'objet spécial Python ``None``. C'est " -"un authentique objet Python plutôt qu'un pointeur *NULL*, qui signifie " -"qu'une erreur est survenue, dans la plupart des situations, comme nous " -"l'avons vu." +":c:data:`Py_None` est la dénomination en C pour l'objet spécial Python " +"``None``. C'est un authentique objet Python plutôt qu'un pointeur ``NULL``, " +"qui signifie qu'une erreur est survenue, dans la plupart des situations, " +"comme nous l'avons vu." #: extending/extending.rst:318 msgid "The Module's Method Table and Initialization Function" @@ -639,6 +633,10 @@ msgid "" "`PyInit_name`, where *name* is the name of the module, and should be the " "only non-\\ ``static`` item defined in the module file::" msgstr "" +"Cette structure, à son tour, doit être transmise à l'interpréteur dans la " +"fonction d'initialisation du module. La fonction d'initialisation doit être " +"nommée :c:func:`PyInit_name`, où *nom* est le nom du module, et doit être le " +"seul élément non ``static`` défini dans le fichier du module ::" #: extending/extending.rst:368 msgid "" @@ -646,6 +644,10 @@ msgid "" "type, declares any special linkage declarations required by the platform, " "and for C++ declares the function as ``extern \"C\"``." msgstr "" +"Notez que *PyMODINIT_FUNC* déclare la fonction comme renvoyant un objet de " +"type ``PyObject *``, et déclare également toute déclaration de liaison " +"spéciale requise par la plate-forme, et pour le C++ déclare la fonction " +"comme un C ``extern``." #: extending/extending.rst:372 msgid "" @@ -660,6 +662,17 @@ msgid "" "The init function must return the module object to its caller, so that it " "then gets inserted into ``sys.modules``." msgstr "" +"Lorsque le programme Python importe le module :mod:`spam` pour la première " +"fois, :c:func:`PyInit_spam` est appelé. (Voir ci-dessous pour les " +"commentaires sur l'intégration en Python.) Il appelle :c:func:" +"`PyModule_Create`, qui renvoie un objet module, et insère des objets " +"fonction intégrés dans le module nouvellement créé en se basant sur la table " +"(un tableau de structures :c:type:`PyMethodDef`) trouvée dans la définition " +"du module. :c:func:`PyModule_Create` renvoie un pointeur vers l'objet module " +"qu'il crée. Il peut s'interrompre avec une erreur fatale pour certaines " +"erreurs, ou renvoyer ``NULL`` si le module n'a pas pu être initialisé de " +"manière satisfaisante. La fonction `*init* doit renvoyer l'objet module à " +"son appelant, afin qu'il soit ensuite inséré dans ``sys.modules``." #: extending/extending.rst:383 msgid "" @@ -668,6 +681,11 @@ msgid "" "table. To add the module to the initialization table, use :c:func:" "`PyImport_AppendInittab`, optionally followed by an import of the module::" msgstr "" +"Lors de l'intégration de Python, la fonction :c:func:`PyInit_spam` n'est pas " +"appelée automatiquement, sauf s'il y a une entrée dans la table :c:data:" +"`PyImport_Inittab`. Pour ajouter le module à la table d'initialisation, " +"utilisez :c:func:`PyImport_AppendInittab`, suivi éventuellement d'une " +"importation du module ::" #: extending/extending.rst:427 msgid "" @@ -677,6 +695,12 @@ msgid "" "extension modules. Extension module authors should exercise caution when " "initializing internal data structures." msgstr "" +"Supprimer des entrées de ``sys.modules`` ou importer des modules compilés " +"dans plusieurs interpréteurs au sein d'un processus (ou suivre un :c:func:" +"`fork` sans l'intervention d'un :c:func:`exec`) peut créer des problèmes " +"pour certains modules d'extension. Les auteurs de modules d'extension " +"doivent faire preuve de prudence lorsqu'ils initialisent des structures de " +"données internes." #: extending/extending.rst:433 msgid "" @@ -684,6 +708,9 @@ msgid "" "distribution as :file:`Modules/xxmodule.c`. This file may be used as a " "template or simply read as an example." msgstr "" +"Un exemple de module plus substantiel est inclus dans la distribution des " +"sources Python sous le nom :file:`Modules/xxmodule.c`. Ce fichier peut être " +"utilisé comme modèle ou simplement lu comme exemple." #: extending/extending.rst:439 msgid "" @@ -692,10 +719,15 @@ msgid "" "``PyInit_spam``, and creation of the module is left to the import machinery. " "For details on multi-phase initialization, see :PEP:`489`." msgstr "" +"Contrairement à notre exemple de ``spam``, ``xxmodule`` utilise une " +"*initialisation multi-phase* (nouveau en Python 3.5), où une structure " +"*PyModuleDef* est renvoyée à partir de ``PyInit_spam``, et la création du " +"module est laissée au mécanisme d'importation. Pour plus de détails sur " +"l'initialisation multi-phase, voir :PEP:`489`." #: extending/extending.rst:448 msgid "Compilation and Linkage" -msgstr "" +msgstr "Compilation et liaison" #: extending/extending.rst:450 msgid "" @@ -734,7 +766,7 @@ msgstr "" #: extending/extending.rst:485 msgid "Calling Python Functions from C" -msgstr "" +msgstr "Appeler des fonctions Python en C" #: extending/extending.rst:487 msgid "" @@ -773,6 +805,10 @@ msgid "" "c:func:`PyArg_ParseTuple` function and its arguments are documented in " "section :ref:`parsetuple`." msgstr "" +"Cette fonction doit être déclarée en utilisant le drapeau :const:" +"`METH_VARARGS` ; ceci est décrit dans la section :ref:`methodtable`. La " +"fonction :c:func:`PyArg_ParseTuple` et ses arguments sont documentés dans la " +"section :ref:`parsetuple`." #: extending/extending.rst:536 msgid "" @@ -781,6 +817,11 @@ msgid "" "pointers (but note that *temp* will not be ``NULL`` in this context). More " "info on them in section :ref:`refcounts`." msgstr "" +"Les macros :c:func:`Py_XINCREF` et :c:func:`Py_XDECREF` incrémentent/" +"décrémentent le compteur des références d'un objet et sont sûres quant à la " +"présence de pointeurs ``NULL`` (mais notez que *temp* ne sera pas ``NULL`` " +"dans ce contexte). Plus d'informations à ce sujet dans la section :ref:" +"`refcounts`." #: extending/extending.rst:543 msgid "" @@ -822,6 +863,15 @@ msgid "" "handle the exception. If this is not possible or desirable, the exception " "should be cleared by calling :c:func:`PyErr_Clear`. For example::" msgstr "" +"Mais avant de le faire, il est important de vérifier que la valeur renvoyée " +"n'est pas ``NULL``. Si c'est le cas, la fonction Python s'est terminée par " +"la levée d'une exception. Si le code C qui a appelé :c:func:" +"`PyObject_CallObject` est appelé depuis Python, il devrait maintenant " +"renvoyer une indication d'erreur à son appelant Python, afin que " +"l'interpréteur puisse afficher la pile d'appels, ou que le code Python " +"appelant puisse gérer l'exception. Si cela n'est pas possible ou " +"souhaitable, l'exception doit être effacée en appelant :c:func:" +"`PyErr_Clear`. Par exemple ::" #: extending/extending.rst:589 msgid "" @@ -834,6 +884,16 @@ msgid "" "simplest way to do this is to call :c:func:`Py_BuildValue`. For example, if " "you want to pass an integral event code, you might use the following code::" msgstr "" +"Selon l'interface souhaitée pour la fonction de rappel Python, vous devrez " +"peut-être aussi fournir une liste d'arguments à :c:func:" +"`PyObject_CallObject`. Dans certains cas, la liste d'arguments est également " +"fournie par le programme Python, par l'intermédiaire de la même interface " +"qui a spécifié la fonction de rappel. Elle peut alors être sauvegardée et " +"utilisée de la même manière que l'objet fonction. Dans d'autres cas, vous " +"pouvez avoir à construire un nouveau n-uplet à passer comme liste " +"d'arguments. La façon la plus simple de faire cela est d'appeler :c:func:" +"`Py_BuildValue`. Par exemple, si vous voulez passer un code d'événement " +"intégral, vous pouvez utiliser le code suivant ::" #: extending/extending.rst:608 msgid "" @@ -849,14 +909,18 @@ msgid "" "`PyObject_Call`, which supports arguments and keyword arguments. As in the " "above example, we use :c:func:`Py_BuildValue` to construct the dictionary. ::" msgstr "" +"Vous pouvez également appeler une fonction avec des arguments nommés en " +"utilisant :c:func:`PyObject_Call`, qui accepte les arguments et les " +"arguments nommés. Comme dans l'exemple ci-dessus, nous utilisons :c:func:" +"`Py_BuildValue` pour construire le dictionnaire. ::" #: extending/extending.rst:630 msgid "Extracting Parameters in Extension Functions" -msgstr "" +msgstr "Extraire des paramètres dans des fonctions d'extension" #: extending/extending.rst:634 msgid "The :c:func:`PyArg_ParseTuple` function is declared as follows::" -msgstr "" +msgstr "La fonction :c:func:`PyArg_ParseTuple` est déclarée ainsi ::" #: extending/extending.rst:638 msgid "" @@ -881,21 +945,22 @@ msgid "" "*borrowed* references; do not decrement their reference count!" msgstr "" "Notez que n'importe quelles références sur un objet Python qui sont données " -"à l'appelant sont des références *empruntées* ; ne décrémentez pas leur " -"compteur de références !" +"à l'appelant sont des références *empruntées* ; ne décrémentez pas leur " +"compteur de références !" #: extending/extending.rst:652 msgid "Some example calls::" -msgstr "" +msgstr "Quelques exemples d'appels ::" #: extending/extending.rst:722 msgid "Keyword Parameters for Extension Functions" -msgstr "" +msgstr "Paramètres nommés pour des fonctions d'extension" #: extending/extending.rst:726 msgid "" "The :c:func:`PyArg_ParseTupleAndKeywords` function is declared as follows::" msgstr "" +"La fonction :c:func:`PyArg_ParseTupleAndKeywords` est déclarée ainsi ::" #: extending/extending.rst:731 msgid "" @@ -908,6 +973,14 @@ msgid "" "`PyArg_ParseTupleAndKeywords` returns true, otherwise it returns false and " "raises an appropriate exception." msgstr "" +"Les paramètres *arg* et *format* sont identiques à ceux de la fonction :c:" +"func:`PyArg_ParseTuple`. Le paramètre *kwdict* est le dictionnaire de mots-" +"clés reçu comme troisième paramètre du *runtime* Python. Le paramètre " +"*kwlist* est une liste de chaînes de caractères terminée par ``NULL`` qui " +"identifie les paramètres ; les noms sont mis en correspondance, de gauche à " +"droite, avec les informations de type de *format*. En cas de succès du " +"processus, :c:func:`PyArg_ParseTupleAndKeywords` renvoie vrai, sinon il " +"renvoie faux et lève une exception appropriée." #: extending/extending.rst:741 msgid "" @@ -915,22 +988,29 @@ msgid "" "parameters passed in which are not present in the *kwlist* will cause :exc:" "`TypeError` to be raised." msgstr "" +"Les n-uplets imbriqués ne peuvent pas être traités lorsqu'on utilise des " +"arguments de type mot-clé ! Ceux-ci doivent apparaître dans dans *kwlist*, " +"dans le cas contraire une exception :exc:`TypeError` est levée." #: extending/extending.rst:747 msgid "" "Here is an example module which uses keywords, based on an example by Geoff " "Philbrick (philbrick@hks.com)::" msgstr "" +"Voici un exemple de module qui utilise des mots-clés, basé sur un exemple de " +"*Geoff Philbrick* (philbrick@hks.com) ::" #: extending/extending.rst:802 msgid "Building Arbitrary Values" -msgstr "" +msgstr "Créer des valeurs arbitraires" #: extending/extending.rst:804 msgid "" "This function is the counterpart to :c:func:`PyArg_ParseTuple`. It is " "declared as follows::" msgstr "" +"Cette fonction est le complément de :c:func:`PyArg_ParseTuple`. Elle est " +"déclarée comme suit ::" #: extending/extending.rst:809 msgid "" @@ -939,8 +1019,14 @@ msgid "" "not output) must not be pointers, just values. It returns a new Python " "object, suitable for returning from a C function called from Python." msgstr "" +"Il reconnaît un ensemble d'unités de format similaires à celles reconnues " +"par :c:func:`PyArg_ParseTuple`, mais les arguments (qui sont les données en " +"entrée de fonction, et non de la sortie) ne doivent pas être des pointeurs, " +"mais juste des valeurs. Il renvoie un nouvel objet Python, adapté pour être " +"renvoyé par une fonction C appelée depuis Python." #: extending/extending.rst:814 +#, fuzzy msgid "" "One difference with :c:func:`PyArg_ParseTuple`: while the latter requires " "its first argument to be a tuple (since Python argument lists are always " @@ -951,15 +1037,19 @@ msgid "" "that format unit. To force it to return a tuple of size 0 or one, " "parenthesize the format string." msgstr "" +"Une différence par rapport à :c:func:`PyArg_ParseTuple` : alors que ce " +"dernier nécessite que son premier argument soit un *n*-uplet (puisque les " +"listes d'arguments Python sont toujours représentées par des *n*-uplets en " #: extending/extending.rst:822 msgid "" "Examples (to the left the call, to the right the resulting Python value):" msgstr "" +"Exemples (à gauche l'appel, à droite la valeur résultante, en Python) :" #: extending/extending.rst:848 msgid "Reference Counts" -msgstr "" +msgstr "Compteurs de références" #: extending/extending.rst:850 msgid "" @@ -969,6 +1059,12 @@ msgid "" "``new`` and ``delete`` are used with essentially the same meaning and we'll " "restrict the following discussion to the C case." msgstr "" +"Dans les langages comme le C ou le C++, le développeur est responsable de " +"l'allocation dynamique et de la dés-allocation de la mémoire sur le tas. En " +"C, cela se fait à l'aide des fonctions :c:func:`malloc` et :c:func:`free`. " +"En C++, les opérateurs ``new`` et ``delete`` sont utilisés avec " +"essentiellement la même signification et nous limiterons la discussion " +"suivante au cas du C." #: extending/extending.rst:856 msgid "" @@ -1012,6 +1108,14 @@ msgid "" "reference to it is deleted. When the counter reaches zero, the last " "reference to the object has been deleted and the object is freed." msgstr "" +"Comme Python fait un usage intensif de :c:func:`malloc` et de :c:func:" +"`free`, il a besoin d'une stratégie pour éviter les fuites de mémoire ainsi " +"que l'utilisation de la mémoire libérée. La méthode choisie est appelée :dfn:" +"`reference counting`. Le principe est simple : chaque objet contient un " +"compteur, qui est incrémenté lorsqu'une référence à l'objet est stockée " +"quelque part, et qui est décrémenté lorsqu'une référence à celui-ci est " +"supprimée. Lorsque le compteur atteint zéro, la dernière référence à l'objet " +"a été supprimée et l'objet est libéré." #: extending/extending.rst:888 msgid "" @@ -1028,6 +1132,19 @@ msgid "" "garbage collector will be available for C. Until then, we'll have to live " "with reference counts." msgstr "" +"Une stratégie alternative est appelée :dfn:`automatic garbage collection` " +"(ramasse-miettes). Parfois, le comptage des références est également appelé " +"stratégie de ramasse-miettes, d'où l'utilisation du terme \"automatique\" " +"pour distinguer les deux. Le grand avantage du ramasse-miettes est que " +"l'utilisateur n'a pas besoin d'appeler :c:func:`free` explicitement. (Un " +"autre avantage important est l'amélioration de la vitesse ou de " +"l'utilisation de la mémoire, ce n'est cependant pas un fait avéré). " +"L'inconvénient est que pour C, il n'y a pas de ramasse-miettes portable " +"proprement-dit, alors que le comptage des références peut être implémenté de " +"façon portable (tant que les fonctions :c:func:`malloc` et :c:func:`free` " +"soient disponibles, ce que la norme C garantit). Peut-être qu'un jour un " +"ramasse-miettes suffisamment portable sera disponible pour C. D'ici là, nous " +"devrons utiliser les compteurs des références." #: extending/extending.rst:900 msgid "" @@ -1042,6 +1159,18 @@ msgid "" "in a reference cycle, or referenced from the objects in the cycle, even " "though there are no further references to the cycle itself." msgstr "" +"Bien que Python utilise l'implémentation traditionnelle de comptage de " +"référence, il contient également un détecteur de cycles qui fonctionne pour " +"détecter les cycles de référence. Cela permet aux applications d'empêcher la " +"création de références circulaires directes ou indirectes ; ceci sont les " +"faiblesses du ramasse-miettes mis en œuvre en utilisant uniquement le " +"comptage de référence. Les cycles de référence sont constitués d'objets qui " +"contiennent des références (éventuellement indirectes) à eux-mêmes, de sorte " +"que chaque objet du cycle a un comptage de référence qui n'est pas nul. Les " +"implémentations typiques de comptage de référence ne sont pas capables de " +"récupérer la mémoire appartenant à des objets dans un cycle de référence, ou " +"référencés à partir des objets dans le cycle, même s'il n'y a pas d'autres " +"références au cycle lui-même." #: extending/extending.rst:911 msgid "" @@ -1057,7 +1186,7 @@ msgstr "" #: extending/extending.rst:925 msgid "Reference Counting in Python" -msgstr "" +msgstr "Comptage de références en Python" #: extending/extending.rst:927 msgid "" @@ -1069,6 +1198,13 @@ msgid "" "this purpose (and others), every object also contains a pointer to its type " "object." msgstr "" +"Il existe deux macros, ``Py_INCREF(x)`` et ``Py_DECREF(x)``, qui gèrent " +"l'incrémentation et la décrémentation du comptage de référence. :c:func:" +"`Py_DECREF` libère également l'objet lorsque le comptage atteint zéro. Pour " +"plus de flexibilité, il n'appelle pas :c:func:`free` directement — plutôt, " +"il fait un appel à travers un pointeur de fonction dans l'objet :dfn:`type " +"objet` de l'objet. À cette fin (et pour d'autres), chaque objet contient " +"également un pointeur vers son objet type." #: extending/extending.rst:934 msgid "" @@ -1082,6 +1218,16 @@ msgid "" "on, store it, or call :c:func:`Py_DECREF`. Forgetting to dispose of an owned " "reference creates a memory leak." msgstr "" +"La grande question demeure maintenant : quand utiliser ``Py_INCREF(x)`` et " +"``Py_DECREF(x)`` ? Commençons par définir quelques termes. Personne ne " +"possède un objet, mais vous pouvez en :dfn:`avoir une référence`. Le " +"comptage de références d'un objet est maintenant défini comme étant le " +"nombre de références à cet objet. Le propriétaire d'une référence est " +"responsable d'appeler :c:func:`Py_DECREF` lorsque la référence n'est plus " +"nécessaire. La propriété d'une référence peut être transférée. Il y a trois " +"façons de disposer d'une référence : la transmettre, la stocker, ou appeler :" +"c:func:`Py_DECREF`. Oublier de se débarrasser d'une référence crée une fuite " +"de mémoire." #: extending/extending.rst:943 msgid "" @@ -1102,6 +1248,14 @@ msgid "" "code a borrowed reference can be used after the owner from which it was " "borrowed has in fact disposed of it." msgstr "" +"L'avantage d'emprunter, plutôt qu'être propriétaire d'une référence est que " +"vous n'avez pas à vous soucier de disposer de la référence sur tous les " +"chemins possibles dans le code — en d'autres termes, avec une référence " +"empruntée, vous ne courez pas le risque de fuites lors d'une sortie " +"prématurée. L'inconvénient de l'emprunt par rapport à la possession est " +"qu'il existe certaines situations subtiles où, dans un code apparemment " +"correct, une référence empruntée peut être utilisée après que le " +"propriétaire auquel elle a été empruntée l'a en fait éliminée." #: extending/extending.rst:957 msgid "" @@ -1114,7 +1268,7 @@ msgstr "" #: extending/extending.rst:967 msgid "Ownership Rules" -msgstr "" +msgstr "Règles concernant la propriété de références" #: extending/extending.rst:969 msgid "" @@ -1122,6 +1276,10 @@ msgid "" "of the function's interface specification whether ownership is transferred " "with the reference or not." msgstr "" +"Chaque fois qu'une référence d'objet est passée à l'intérieur ou à " +"l'extérieur d'une fonction, elle fait partie de la spécification de " +"l'interface de la fonction, peu importe que la propriété soit transférée " +"avec la référence ou non." #: extending/extending.rst:973 msgid "" @@ -1181,7 +1339,7 @@ msgstr "" #: extending/extending.rst:1014 msgid "Thin Ice" -msgstr "" +msgstr "Terrain dangereux" #: extending/extending.rst:1016 msgid "" @@ -1190,6 +1348,10 @@ msgid "" "invocations of the interpreter, which can cause the owner of a reference to " "dispose of it." msgstr "" +"Il existe quelques situations où l'utilisation apparemment inoffensive d'une " +"référence empruntée peut entraîner des problèmes. Tous ces problèmes sont en " +"lien avec des invocations implicites de l’interpréteur, et peuvent amener le " +"propriétaire d'une référence à s'en défaire." #: extending/extending.rst:1020 msgid "" @@ -1197,6 +1359,9 @@ msgid "" "on an unrelated object while borrowing a reference to a list item. For " "instance::" msgstr "" +"Le premier cas, et le plus important à connaître, est celui de l'application " +"de :c:func:`Py_DECREF` à un objet non relié, tout en empruntant une " +"référence à un élément de liste. Par exemple ::" #: extending/extending.rst:1032 msgid "" @@ -1204,6 +1369,9 @@ msgid "" "``list[1]`` with the value ``0``, and finally prints the borrowed reference. " "Looks harmless, right? But it's not!" msgstr "" +"Cette fonction emprunte d'abord une référence à ``list[0]``, puis remplace " +"``list[1]`` par la valeur ``0``, et enfin affiche la référence empruntée. " +"Ça a l'air inoffensif, n'est-ce pas ? Mais ce n'est pas le cas !" #: extending/extending.rst:1036 msgid "" @@ -1214,6 +1382,13 @@ msgid "" "defined a :meth:`__del__` method. If this class instance has a reference " "count of 1, disposing of it will call its :meth:`__del__` method." msgstr "" +"Suivons le flux de contrôle dans :c:func:`PyList_SetItem`. La liste possède " +"des références à tous ses éléments, donc quand l'élément 1 est remplacé, " +"elle doit se débarrasser de l'élément 1 original. Supposons maintenant que " +"l'élément 1 original était une instance d'une classe définie par " +"l'utilisateur, et supposons en outre que la classe définisse une méthode :" +"meth:`__del__`. Si l'instance de cette classe a un nombre des références de " +"1, sa destruction appellera sa méthode :meth:`__del__`." #: extending/extending.rst:1043 msgid "" @@ -1225,6 +1400,13 @@ msgid "" "this was the last reference to that object, it would free the memory " "associated with it, thereby invalidating ``item``." msgstr "" +"Comme elle est écrite en Python, la méthode :meth:`__del__` peut exécuter du " +"code Python arbitraire. Pourrait-elle faire quelque chose pour invalider la " +"référence à ``item`` dans :c:func:`bug` ? Bien sûr ! En supposant que la " +"liste passée dans :c:func:`bug` est accessible à la méthode :meth:`__del__`, " +"elle pourrait exécuter une instruction à l'effet de ``del list[0]``, et en " +"supposant que ce soit la dernière référence à cet objet, elle libérerait la " +"mémoire qui lui est associée, invalidant ainsi ``item``." #: extending/extending.rst:1051 msgid "" @@ -1251,10 +1433,20 @@ msgid "" "complete. Obviously, the following function has the same problem as the " "previous one::" msgstr "" +"Le deuxième cas de problèmes liés à une référence empruntée est une variante " +"impliquant des fils de discussion. Normalement, plusieurs threads dans " +"l'interpréteur Python ne peuvent pas se gêner mutuellement, car il existe un " +"verrou global protégeant tout l'espace objet de Python. Cependant, il est " +"possible de libérer temporairement ce verrou en utilisant la macro :c:macro:" +"`Py_BEGIN_ALLOW_THREADS`, et de le ré-acquérir en utilisant :c:macro:" +"`Py_END_ALLOW_THREADS`. Ceci est un procédé courant pour bloquer les appels " +"d'entrées/sorties, afin de permettre aux autres threads d'utiliser le " +"processeur en attendant que les E/S soient terminées. Évidemment, la " +"fonction suivante a le même problème que la précédente ::" #: extending/extending.rst:1092 msgid "NULL Pointers" -msgstr "" +msgstr "Pointeurs ``NULL``" #: extending/extending.rst:1094 msgid "" @@ -1267,6 +1459,16 @@ msgid "" "``NULL``, there would be a lot of redundant tests and the code would run " "more slowly." msgstr "" +"En général, les fonctions qui prennent des références d'objets comme " +"arguments ne sont pas conçues pour recevoir des pointeurs ``NULL``, et si " +"vous en donnez comme arguments, elles causeront une erreur de segmentation " +"(ou provoqueront des *core dump* ultérieurs). Les fonctions qui renvoient " +"des références d'objets renvoient généralement ``NULL`` uniquement pour " +"indiquer qu'une exception s'est produite. La raison pour laquelle les " +"arguments ``NULL`` ne sont pas testés est que les fonctions passent souvent " +"les objets qu'elles reçoivent à d'autres fonctions, si chaque fonction " +"devait tester pour ``NULL``, il y aurait beaucoup de tests redondants et le " +"code s'exécuterait plus lentement." #: extending/extending.rst:1102 msgid "" @@ -1274,6 +1476,9 @@ msgid "" "that may be ``NULL`` is received, for example, from :c:func:`malloc` or from " "a function that may raise an exception." msgstr "" +"Il est préférable de tester la présence de ``NULL`` uniquement au début : " +"lorsqu'un pointeur qui peut être ``NULL`` est reçu, par exemple, de :c:func:" +"`malloc` ou d'une fonction qui peut lever une exception." #: extending/extending.rst:1106 msgid "" @@ -1281,6 +1486,9 @@ msgid "" "``NULL`` pointers --- however, their variants :c:func:`Py_XINCREF` and :c:" "func:`Py_XDECREF` do." msgstr "" +"Les macros :c:func:`Py_INCREF` et :c:func:`Py_DECREF` ne vérifient pas les " +"pointeurs ``NULL``. Cependant, leurs variantes :c:func:`Py_XINCREF` et :c:" +"func:`Py_XDECREF` le font." #: extending/extending.rst:1110 msgid "" @@ -1297,16 +1505,21 @@ msgid "" "C functions (``args`` in the examples) is never ``NULL`` --- in fact it " "guarantees that it is always a tuple [#]_." msgstr "" +"Le mécanisme d'appel de fonctions C garantit que la liste d'arguments passée " +"aux fonctions C (``args`` dans les exemples) n'est jamais ``NULL``. En fait, " +"il garantit qu'il s'agit toujours d'un n-uplet [#]_." #: extending/extending.rst:1120 msgid "" "It is a severe error to ever let a ``NULL`` pointer \"escape\" to the Python " "user." msgstr "" +"C'est une grave erreur de laisser un pointeur ``NULL`` \"échapper\" à " +"l'utilisateur Python." #: extending/extending.rst:1131 msgid "Writing Extensions in C++" -msgstr "" +msgstr "Écrire des extensions en C++" #: extending/extending.rst:1133 msgid "" @@ -1320,10 +1533,21 @@ msgid "" "`` --- they use this form already if the symbol ``__cplusplus`` is defined " "(all recent C++ compilers define this symbol)." msgstr "" +"C'est possible d'écrire des modules d'extension en C++, mais sous certaines " +"conditions. Si le programme principal (l'interpréteur Python) est compilé et " +"lié par le compilateur C, les objets globaux ou statiques avec les " +"constructeurs ne peuvent pas être utilisés. Ceci n'est pas un problème si le " +"programme principal est relié par le compilateur C++. Les fonctions qui " +"seront appelées par l'interpréteur Python (en particulier, les fonctions " +"d'initialisation des modules) doivent être déclarées en utilisant ``extern " +"\"C\"``. Il n'est pas nécessaire d'inclure les fichiers d'en-tête Python " +"dans le ``extern \"C\" {…}``, car ils utilisent déjà ce format si le symbole " +"``__cplusplus`` est défini (tous les compilateurs C++ récents définissent ce " +"symbole)." #: extending/extending.rst:1147 msgid "Providing a C API for an Extension Module" -msgstr "" +msgstr "Fournir une API en langage C pour un module d'extension" #: extending/extending.rst:1152 msgid "" @@ -1335,6 +1559,15 @@ msgid "" "create and manipulate lists, this new collection type should have a set of C " "functions for direct manipulation from other extension modules." msgstr "" +"De nombreux modules d'extension fournissent simplement de nouvelles " +"fonctions et de nouveaux types à utiliser à partir de Python, mais parfois " +"le code d'un module d'extension peut être utile pour d'autres modules " +"d'extension. Par exemple, un module d'extension peut mettre en œuvre un type " +"\"collection\" qui fonctionne comme des listes sans ordre. Tout comme le " +"type de liste Python standard possède une API C qui permet aux modules " +"d'extension de créer et de manipuler des listes, ce nouveau type de " +"collection devrait posséder un ensemble de fonctions C pour une manipulation " +"directe à partir d'autres modules d'extension." #: extending/extending.rst:1160 msgid "" @@ -1351,6 +1584,20 @@ msgid "" "if symbols are globally visible, the module whose functions one wishes to " "call might not have been loaded yet!" msgstr "" +"À première vue, cela semble facile : il suffit d'écrire les fonctions (sans " +"les déclarer \"statiques\", bien sûr), de fournir un fichier d'en-tête " +"approprié et de documenter l'API C. Et en fait, cela fonctionnerait si tous " +"les modules d'extension étaient toujours liés statiquement avec " +"l'interpréteur Python. Cependant, lorsque les modules sont utilisés comme " +"des bibliothèques partagées, les symboles définis dans un module peuvent ne " +"pas être visibles par un autre module. Les détails de la visibilité " +"dépendent du système d'exploitation ; certains systèmes utilisent un espace " +"de noms global pour l'interpréteur Python et tous les modules d'extension " +"(Windows, par exemple), tandis que d'autres exigent une liste explicite des " +"symboles importés au moment de la liaison des modules (AIX en est un " +"exemple), ou offrent un choix de stratégies différentes (la plupart des " +"*Unix*). Et même si les symboles sont globalement visibles, le module dont " +"on souhaite appeler les fonctions n'est peut-être pas encore chargé !" #: extending/extending.rst:1172 msgid "" @@ -1361,6 +1608,14 @@ msgid "" "section :ref:`methodtable`). And it means that symbols that *should* be " "accessible from other extension modules must be exported in a different way." msgstr "" +"La portabilité exige donc de ne faire aucune supposition sur la visibilité " +"des symboles. Cela signifie que tous les symboles des modules d'extension " +"doivent être déclarés ``static``, à l'exception de la fonction " +"d'initialisation du module, afin d'éviter les conflits de noms avec les " +"autres modules d'extension (comme discuté dans la section :ref:" +"`methodtable`). Et cela signifie que les symboles qui *devraient* être " +"accessibles à partir d'autres modules d'extension doivent être exportés " +"d'une manière différente." #: extending/extending.rst:1179 msgid "" @@ -1383,8 +1638,16 @@ msgid "" "distributed in different ways between the module providing the code and the " "client modules." msgstr "" +"Il existe de nombreuses façons d'utiliser les Capsules pour exporter l'API C " +"d'un module d'extension. Chaque fonction peut obtenir sa propre Capsule, ou " +"tous les pointeurs de l'API C peuvent être stockés dans un tableau dont " +"l'adresse est inscrite dans une Capsule. Et les différentes tâches de " +"stockage et de récupération des pointeurs peuvent être réparties de " +"différentes manières entre le module fournissant le code et les modules " +"clients." #: extending/extending.rst:1193 +#, fuzzy msgid "" "Whichever method you choose, it's important to name your Capsules properly. " "The function :c:func:`PyCapsule_New` takes a name parameter (:c:type:`const " @@ -1393,6 +1656,13 @@ msgid "" "of runtime type-safety; there is no feasible way to tell one unnamed Capsule " "from another." msgstr "" +"Quelle que soit la méthode que vous choisissez, il est important de bien " +"nommer vos Capsules. La fonction :c:func:`PyCapsule_New` prend un paramètre " +"nommé (:c:type:`const char \\*`). Vous êtes autorisé à passer un nom " +"``NULL``, mais nous vous encourageons vivement à spécifier un nom. Des " +"Capsules correctement nommées offrent un certain degré de sécurité " +"concernant un éventuel conflit de types, car il n'y a pas de moyen de " +"distinguer deux ou plusieurs Capsules non nommée entre elles." #: extending/extending.rst:1200 msgid "" @@ -1401,12 +1671,18 @@ msgid "" msgstr "" #: extending/extending.rst:1205 +#, fuzzy msgid "" "The convenience function :c:func:`PyCapsule_Import` makes it easy to load a " "C API provided via a Capsule, but only if the Capsule's name matches this " "convention. This behavior gives C API users a high degree of certainty that " "the Capsule they load contains the correct C API." msgstr "" +"La fonction communément utilisée :c:func:`PyCapsule_Import` permet de " +"charger facilement une API C fournie via une Capsule, mais seulement si le " +"nom de la Capsule correspond à cette convention. Ce comportement donne aux " +"utilisateurs d'API C un degré élevé de certitude que la Capsule qu'ils " +"chargent contient l'API C correcte." #: extending/extending.rst:1210 msgid "" @@ -1418,6 +1694,14 @@ msgid "" "takes care of importing the module and retrieving its C API pointers; client " "modules only have to call this macro before accessing the C API." msgstr "" +"L'exemple suivant montre une approche qui fait peser la plus grande partie " +"de la charge sur le rédacteur du module d'exportation, ce qui est approprié " +"pour les modules de bibliothèque couramment utilisés. Il stocke tous les " +"pointeurs de l'API C (un seul dans l'exemple !) dans un tableau de " +"pointeurs :c:type:`void` qui devient la valeur d'une Capsule. Le fichier " +"d'en-tête correspondant au module fournit une macro qui se charge d'importer " +"le module et de récupérer ses pointeurs d'API C. Les modules clients n'ont " +"qu'à appeler cette macro avant d'accéder à l'API C." #: extending/extending.rst:1218 msgid "" @@ -1428,6 +1712,13 @@ msgid "" "complicated in reality (such as adding \"spam\" to every command). This " "function :c:func:`PySpam_System` is also exported to other extension modules." msgstr "" +"Le module d'exportation est une modification du module :mod:`spam` de la " +"section :ref:`extending-simpleexample`. La fonction :func:`spam.system` " +"n'appelle pas directement la fonction de la bibliothèque C :c:func:`system`, " +"mais une fonction :c:func:`PySpam_System`, qui ferait bien sûr quelque chose " +"de plus compliqué en réalité (comme ajouter du *spam* à chaque commande). " +"Cette fonction :c:func:`PySpam_System` est également exportée vers d'autres " +"modules d'extension." #: extending/extending.rst:1225 msgid "" @@ -1437,15 +1728,15 @@ msgstr "" #: extending/extending.rst:1234 msgid "The function :c:func:`spam_system` is modified in a trivial way::" -msgstr "" +msgstr "La fonction :c:func:`spam_system` est modifiée de manière simple ::" #: extending/extending.rst:1248 msgid "In the beginning of the module, right after the line ::" -msgstr "" +msgstr "Au début du module, immédiatement après la ligne ::" #: extending/extending.rst:1252 msgid "two more lines must be added::" -msgstr "" +msgstr "on doit ajouter deux lignes supplémentaires ::" #: extending/extending.rst:1257 msgid "" @@ -1454,18 +1745,26 @@ msgid "" "initialization function must take care of initializing the C API pointer " "array::" msgstr "" +"L'indicateur ``#define`` est utilisé pour indiquer au fichier d'en-tête " +"qu'il est inclus dans le module d'exportation, et non dans un module client. " +"Enfin, la fonction d'initialisation du module doit prendre en charge " +"l'initialisation du tableau de pointeurs de l'API C ::" #: extending/extending.rst:1287 msgid "" "Note that ``PySpam_API`` is declared ``static``; otherwise the pointer array " "would disappear when :func:`PyInit_spam` terminates!" msgstr "" +"Notez que ``PySpam_API`` est déclaré ``static`` ; sinon le tableau de " +"pointeurs disparaîtrait lorsque :func:`PyInit_spam`` se finit !" #: extending/extending.rst:1290 msgid "" "The bulk of the work is in the header file :file:`spammodule.h`, which looks " "like this::" msgstr "" +"L'essentiel du travail se trouve dans le fichier d'en-tête :file:`spammodule." +"h`, qui ressemble à ceci ::" #: extending/extending.rst:1341 msgid "" @@ -1473,6 +1772,9 @@ msgid "" "func:`PySpam_System` is to call the function (or rather macro) :c:func:" "`import_spam` in its initialization function::" msgstr "" +"Tout ce qu'un module client doit faire pour avoir accès à la fonction :c:" +"func:`PySpam_System` est d'appeler la fonction (ou plutôt la macro) :c:func:" +"`import_spam` dans sa fonction d'initialisation ::" #: extending/extending.rst:1359 msgid "" @@ -1480,6 +1782,10 @@ msgid "" "is rather complicated. However, the basic structure is the same for each " "function that is exported, so it has to be learned only once." msgstr "" +"Le principal inconvénient de cette approche est que le fichier :file:" +"`spammodule.h` est assez compliqué. Cependant, la structure de base est la " +"même pour chaque fonction exportée, ce qui fait qu'elle ne doit être apprise " +"qu'une seule fois." #: extending/extending.rst:1363 msgid "" @@ -1490,6 +1796,13 @@ msgid "" "Capsules (files :file:`Include/pycapsule.h` and :file:`Objects/pycapsule.c` " "in the Python source code distribution)." msgstr "" +"Enfin, il convient de mentionner que Capsules offrent des fonctionnalités " +"supplémentaires, qui sont particulièrement utiles pour l'allocation de la " +"mémoire et la dés-allocation du pointeur stocké dans un objet Capsule. Les " +"détails sont décrits dans le manuel de référence de l'API Python/C dans la " +"section :ref:`capsules` et dans l'implémentation des Capsules (fichiers :" +"file:`Include/pycapsule.h` et :file:`Objects/pycapsule.c` dans la " +"distribution du code source Python)." #: extending/extending.rst:1371 msgid "Footnotes" @@ -1500,12 +1813,16 @@ msgid "" "An interface for this function already exists in the standard module :mod:" "`os` --- it was chosen as a simple and straightforward example." msgstr "" +"Une interface pour cette fonction existe déjà dans le module standard :mod:" +"`os`, elle a été choisie comme un exemple simple et direct." #: extending/extending.rst:1375 msgid "" "The metaphor of \"borrowing\" a reference is not completely correct: the " "owner still has a copy of the reference." msgstr "" +"L'expression « emprunter une référence » n'est pas tout à fait correcte, car " +"le propriétaire a toujours une copie de la référence." #: extending/extending.rst:1378 msgid "" @@ -1513,9 +1830,15 @@ msgid "" "reference count itself could be in freed memory and may thus be reused for " "another object!" msgstr "" +"Vérifier que le comptage de référence est d'au moins 1 **ne fonctionne " +"pas**, le compte de référence lui-même pourrait être en mémoire libérée et " +"peut donc être réutilisé pour un autre objet !" #: extending/extending.rst:1382 msgid "" "These guarantees don't hold when you use the \"old\" style calling " "convention --- this is still found in much existing code." msgstr "" +"Ces garanties ne sont pas valables lorsqu'on emploie les conventions de " +"nommage anciennes, qu'on retrouve encore assez souvent dans beaucoup de code " +"existant." diff --git a/extending/newtypes.po b/extending/newtypes.po index dc42466e..005f8b98 100644 --- a/extending/newtypes.po +++ b/extending/newtypes.po @@ -6,17 +6,18 @@ msgstr "" "Project-Id-Version: Python 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-08-24 09:01+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2021-02-07 20:03+0100\n" "Language-Team: FRENCH \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Last-Translator: \n" +"X-Generator: Poedit 2.3\n" #: extending/newtypes.rst:7 msgid "Defining Extension Types: Assorted Topics" -msgstr "" +msgstr "Définir les types d'extension : divers sujets" #: extending/newtypes.rst:11 msgid "" @@ -68,16 +69,21 @@ msgid "" "Here you can put a string (or its address) that you want returned when the " "Python script references ``obj.__doc__`` to retrieve the doc string." msgstr "" +"Ici vous pouvez mettre une chaîne (ou son adresse) que vous voulez renvoyer " +"lorsque le script Python référence ``obj.__doc__`` pour récupérer le " +"*docstring*." #: extending/newtypes.rst:49 msgid "" "Now we come to the basic type methods -- the ones most extension types will " "implement." msgstr "" +"Nous en arrivons maintenant aux méthodes de type basiques -- celles que la " +"plupart des types d'extension mettront en œuvre." #: extending/newtypes.rst:54 msgid "Finalization and De-allocation" -msgstr "" +msgstr "Finalisation et de-allocation" #: extending/newtypes.rst:66 msgid "" @@ -125,11 +131,11 @@ msgstr "" #: extending/newtypes.rst:136 msgid ":pep:`442` explains the new finalization scheme." -msgstr "" +msgstr ":pep:`442` explique le nouveau schéma de finalisation." #: extending/newtypes.rst:143 msgid "Object Presentation" -msgstr "" +msgstr "Présentation de l'objet" #: extending/newtypes.rst:145 msgid "" @@ -165,11 +171,11 @@ msgstr "" #: extending/newtypes.rst:176 msgid "Here is a simple example::" -msgstr "" +msgstr "Voici un exemple simple ::" #: extending/newtypes.rst:188 msgid "Attribute Management" -msgstr "" +msgstr "Gestion des attributs" #: extending/newtypes.rst:190 msgid "" @@ -203,7 +209,7 @@ msgstr "" #: extending/newtypes.rst:219 msgid "Generic Attribute Management" -msgstr "" +msgstr "Gestion des attributs génériques" #: extending/newtypes.rst:221 msgid "" @@ -216,6 +222,8 @@ msgid "" "The name of the attributes must be known when :c:func:`PyType_Ready` is " "called." msgstr "" +"Le nom des attributs doivent être déjà connus lorsqu'on lance :c:func:" +"`PyType_Ready`." #: extending/newtypes.rst:227 msgid "" @@ -244,6 +252,7 @@ msgstr "" #: extending/newtypes.rst:241 msgid "The tables are declared as three fields of the type object::" msgstr "" +"Les tables sont déclarées sous la forme de trois champs de type objet ::" #: extending/newtypes.rst:247 msgid "" @@ -295,35 +304,35 @@ msgstr "Signification" #: extending/newtypes.rst:288 msgid ":const:`READONLY`" -msgstr "" +msgstr ":const:`READONLY`" #: extending/newtypes.rst:288 msgid "Never writable." -msgstr "" +msgstr "Jamais disponible en écriture." #: extending/newtypes.rst:290 msgid ":const:`READ_RESTRICTED`" -msgstr "" +msgstr ":const:`READ_RESTRICTED`" #: extending/newtypes.rst:290 msgid "Not readable in restricted mode." -msgstr "" +msgstr "Non disponible en lecture, dans le mode restreint." #: extending/newtypes.rst:292 msgid ":const:`WRITE_RESTRICTED`" -msgstr "" +msgstr ":const:`WRITE_RESTRICTED`" #: extending/newtypes.rst:292 msgid "Not writable in restricted mode." -msgstr "" +msgstr "Non disponible en écriture dans le mode restreint." #: extending/newtypes.rst:294 msgid ":const:`RESTRICTED`" -msgstr "" +msgstr ":const:`RESTRICTED`" #: extending/newtypes.rst:294 msgid "Not readable or writable in restricted mode." -msgstr "" +msgstr "Non disponible en lecture ou écriture, en mode restreint." #: extending/newtypes.rst:303 msgid "" @@ -334,6 +343,13 @@ msgid "" "the descriptor from the class object, and get the doc string using its :attr:" "`__doc__` attribute." msgstr "" +"Un avantage intéressant de l'utilisation de la table :c:member:" +"`~PyTypeObject.tp_members` pour construire les descripteurs qui sont " +"utilisés à l'exécution, est que à tout attribut défini de cette façon on " +"peut associer un *docstring*, en écrivant simplement le texte dans la table. " +"Une application peut utiliser l'API d'introspection pour récupérer le " +"descripteur de l'objet de classe, et utiliser son attribut :attr:`__doc__` " +"pour renvoyer le *docstring*." #: extending/newtypes.rst:309 msgid "" @@ -343,7 +359,7 @@ msgstr "" #: extending/newtypes.rst:323 msgid "Type-specific Attribute Management" -msgstr "" +msgstr "Gestion des attributs de type spécifiques" #: extending/newtypes.rst:325 msgid "" @@ -379,7 +395,7 @@ msgstr "" #: extending/newtypes.rst:367 msgid "Object Comparison" -msgstr "" +msgstr "Comparaison des objets" #: extending/newtypes.rst:373 msgid "" @@ -408,7 +424,7 @@ msgstr "" #: extending/newtypes.rst:416 msgid "Abstract Protocol Support" -msgstr "" +msgstr "Support pour le protocole abstrait" #: extending/newtypes.rst:418 msgid "" @@ -466,7 +482,7 @@ msgstr "" #: extending/newtypes.rst:472 msgid "This function takes three arguments:" -msgstr "" +msgstr "Cette fonction prend trois arguments :" #: extending/newtypes.rst:474 msgid "" @@ -491,7 +507,7 @@ msgstr "" #: extending/newtypes.rst:486 msgid "Here is a toy ``tp_call`` implementation::" -msgstr "" +msgstr "Ceci est une implémentation ``tp_call`` très simple ::" #: extending/newtypes.rst:512 msgid "" @@ -510,6 +526,10 @@ msgid "" "tp_iter` handler, which must return an :term:`iterator` object. Here the " "same guidelines apply as for Python classes:" msgstr "" +"Tout objet :term:`iterable` doit implémenter le gestionnaire :c:member:" +"`~PyTypeObject.tp_iter`, qui doit renvoyer un objet de type :term:" +"`iterator`. Ici, les mêmes directives s'appliquent de la même façon que " +"pour les classes *Python* :" #: extending/newtypes.rst:523 msgid "" @@ -517,6 +537,9 @@ msgid "" "independent iterators, a new iterator should be created and returned by each " "call to :c:member:`~PyTypeObject.tp_iter`." msgstr "" +"Pour les collections (telles que les listes et les n-uplets) qui peuvent " +"implémenter plusieurs itérateurs indépendants, un nouvel itérateur doit être " +"créé et renvoyé par chaque appel de type :c:member:`~PyTypeObject.tp_iter`." #: extending/newtypes.rst:526 msgid "" @@ -543,7 +566,7 @@ msgstr "" #: extending/newtypes.rst:547 msgid "Weak Reference Support" -msgstr "" +msgstr "Prise en charge de la référence faible" #: extending/newtypes.rst:549 msgid "" @@ -551,16 +574,22 @@ msgid "" "type to participate in the weak reference mechanism without incurring the " "overhead on performance-critical objects (such as numbers)." msgstr "" +"L'un des objectifs de l'implémentation de la référence faible de *Python* " +"est de permettre à tout type d'objet de participer au mécanisme de référence " +"faible sans avoir à supporter le surcoût de la performance critique des " +"certains objets, tels que les nombres." #: extending/newtypes.rst:554 msgid "Documentation for the :mod:`weakref` module." -msgstr "" +msgstr "Documentation pour le module :mod:`weakref`." #: extending/newtypes.rst:556 msgid "" "For an object to be weakly referencable, the extension type must do two " "things:" msgstr "" +"Pour qu'un objet soit faiblement référençable, le type d'extension doit " +"faire deux choses :" #: extending/newtypes.rst:558 msgid "" @@ -569,6 +598,10 @@ msgid "" "``NULL`` (which is automatic when using the default :c:member:`~PyTypeObject." "tp_alloc`)." msgstr "" +"Inclure un champ :c:type:`PyObject\\*` dans la structure d'objet C dédiée au " +"mécanisme de référence faible. Le constructeur de l'objet doit le laisser à " +"la valeur ``NULL`` (ce qui est automatique lorsque l'on utilise le champ par " +"défaut :c:member:`~PyTypeObject.tp_alloc`)." #: extending/newtypes.rst:563 msgid "" @@ -576,16 +609,23 @@ msgid "" "offset of the aforementioned field in the C object structure, so that the " "interpreter knows how to access and modify that field." msgstr "" +"Définissez le membre de type :c:member:`~PyTypeObject.tp_weaklistoffset` à " +"la valeur de décalage (*offset*) du champ susmentionné dans la structure de " +"l'objet *C*, afin que l'interpréteur sache comment accéder à ce champ et le " +"modifier." #: extending/newtypes.rst:567 msgid "" "Concretely, here is how a trivial object structure would be augmented with " "the required field::" msgstr "" +"Concrètement, voici comment une structure d'objet simple serait complétée " +"par le champ requis ::" #: extending/newtypes.rst:575 msgid "And the corresponding member in the statically-declared type object::" msgstr "" +"Et le membre correspondant dans l'objet de type déclaré statiquement ::" #: extending/newtypes.rst:583 msgid "" @@ -593,10 +633,13 @@ msgid "" "references (by calling :c:func:`PyObject_ClearWeakRefs`) if the field is non-" "``NULL``::" msgstr "" +"Le seul ajout supplémentaire est que ``tp_dealloc`` doit effacer toute " +"référence faible (en appelant :c:func:`PyObject_ClearWeakRefs`) si le champ " +"est non ``NULL`` ::" #: extending/newtypes.rst:599 msgid "More Suggestions" -msgstr "" +msgstr "Plus de suggestions" #: extending/newtypes.rst:601 msgid "" @@ -606,6 +649,12 @@ msgid "" "want (for example, ``tp_richcompare``). You will find examples of the " "function you want to implement." msgstr "" +"Pour savoir comment mettre en œuvre une méthode spécifique pour votre " +"nouveau type de données, téléchargez le code source :term:`CPython`. Allez " +"dans le répertoire :file:`Objects`, puis cherchez dans les fichiers sources " +"*C* la fonction ``tp_`` plus la fonction que vous voulez (par exemple, " +"``tp_richcompare``). Vous trouverez des exemples de la fonction que vous " +"voulez implémenter." #: extending/newtypes.rst:607 msgid "" @@ -613,20 +662,24 @@ msgid "" "you are implementing, use the :c:func:`PyObject_TypeCheck` function. A " "sample of its use might be something like the following::" msgstr "" +"Lorsque vous avez besoin de vérifier qu'un objet est une instance concrète " +"du type que vous implémentez, utilisez la fonction :c:func:" +"`PyObject_TypeCheck`. Voici un exemple de son utilisation ::" #: extending/newtypes.rst:618 msgid "Download CPython source releases." -msgstr "" +msgstr "Télécharger les versions sources de *CPython*." #: extending/newtypes.rst:618 msgid "https://www.python.org/downloads/source/" -msgstr "" +msgstr "https://www.python.org/downloads/source/" #: extending/newtypes.rst:620 msgid "" "The CPython project on GitHub, where the CPython source code is developed." msgstr "" +"Le projet *CPython* sur *GitHub*, où se trouve le code source *CPython*." #: extending/newtypes.rst:621 msgid "https://github.com/python/cpython" -msgstr "" +msgstr "https://github.com/python/cpython"