diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index f68d51f3..a0839f45 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -264,7 +264,8 @@ Troisième étape: Traduction =========================== Avec Poedit ---------------- +----------- + Ici, remplacez « library/sys.po » par le fichier que vous avez choisi précédemment. .. code-block:: bash @@ -272,7 +273,12 @@ Ici, remplacez « library/sys.po » par le fichier que vous avez choisi préc poedit library/sys.po -Ou lancez simplement Poedit puis « Fichier » → « Ouvrir ». +Ou lancez simplement Poedit puis « Fichier » → « Ouvrir ». + +Il n'est pas obligatoire de terminer un fichier, ni de le travailler +de haut en bas, chacun traduit ce qu'il souhaite. Cependant évitons de +changer plus de 200 lignes par *pull request* (pour le confort des +relecteurs). Faire plusieurs *pull requests* est bien sûr autorisé. Vérifications après traduction @@ -613,6 +619,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 ») diff --git a/extending/building.po b/extending/building.po index 041daa6d..fcbd7010 100644 --- a/extending/building.po +++ b/extending/building.po @@ -6,14 +6,14 @@ msgstr "" "Project-Id-Version: Python 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-21 14:55+0200\n" -"PO-Revision-Date: 2021-12-11 12:46+0100\n" -"Last-Translator: Julien Palard \n" +"PO-Revision-Date: 2023-07-28 22:22+0200\n" +"Last-Translator: Christophe Nanteuil \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 3.2.2\n" #: extending/building.rst:7 msgid "Building C and C++ Extensions" @@ -28,7 +28,6 @@ msgstr "" "Linux, un ``.pyd`` sur Windows), qui expose une *fonction d'initialisation*." #: extending/building.rst:12 -#, fuzzy msgid "" "To be importable, the shared library must be available on :envvar:" "`PYTHONPATH`, and must be named after the module name, with an appropriate " @@ -45,7 +44,6 @@ msgid "The initialization function has the signature:" msgstr "La fonction d'initialisation doit avoir le prototype :" #: extending/building.rst:20 -#, fuzzy msgid "" "It returns either a fully initialized module, or a :c:type:`PyModuleDef` " "instance. See :ref:`initializing-modules` for details." @@ -88,7 +86,6 @@ msgstr "" "library\"* dans la :pep:`489` pour plus d'informations." #: extending/building.rst:49 -#, fuzzy msgid "Building C and C++ Extensions with distutils" msgstr "Construire les extensions C et C++ avec *distutils*" @@ -113,7 +110,7 @@ msgstr "" #: extending/building.rst:73 msgid "With this :file:`setup.py`, and a file :file:`demo.c`, running ::" -msgstr "Avec ce :file:`setup.py` et un fichier :file:`demo.c`, lancer ::" +msgstr "Avec ce :file:`setup.py` et un fichier :file:`demo.c`, lancer ::" #: extending/building.rst:77 msgid "" @@ -122,10 +119,10 @@ msgid "" "will end up in a subdirectory :file:`build/lib.system`, and may have a name " "like :file:`demo.so` or :file:`demo.pyd`." msgstr "" -"compilera :file:`demo.c`, et produira un module d'extension nommé ``demo`` " -"dans le dossier :file:`build`. En fonction du système, le fichier du module " -"peut se retrouver dans :file:`build/lib.system`, et son nom peut être :file:" -"`demo.py` ou :file:`demo.pyd`." +"compile :file:`demo.c` et produit un module d'extension nommé ``demo`` dans " +"le dossier :file:`build`. En fonction du système, le fichier du module peut " +"se retrouver dans :file:`build/lib.system`, et son nom peut être :file:`demo." +"py` ou :file:`demo.pyd`." #: extending/building.rst:82 msgid "" @@ -189,7 +186,7 @@ msgstr "" "paquets. En ce qui concerne l'extension, sont définis quelques macros " "préprocesseur, dossiers pour les en-têtes et bibliothèques. En fonction du " "compilateur, *distutils* peut donner ces informations de manière différente. " -"Par exemple, sur Unix, ça peut ressembler aux commandes ::" +"Par exemple, sur Unix, ça peut ressembler aux commandes ::" #: extending/building.rst:139 msgid "" @@ -216,14 +213,14 @@ msgid "" "End-users will typically want to install the module, they do so by running ::" msgstr "" "Typiquement, les utilisateurs vont vouloir installer le module, ils le font " -"en exécutant ::" +"en exécutant ::" #: extending/building.rst:154 msgid "" "Module maintainers should produce source packages; to do so, they run ::" msgstr "" "Les mainteneurs de modules voudront produire des paquets source, pour ce " -"faire ils exécuteront ::" +"faire ils exécuteront ::" #: extending/building.rst:158 msgid "" @@ -232,8 +229,8 @@ msgid "" "`manifest` for details." msgstr "" "Dans certains cas, des fichiers supplémentaires doivent être inclus dans une " -"distribution source : c'est possible via un fichier :file:`MANIFEST.in`, c." -"f. :ref:`manifest`." +"distribution source : c'est possible via un fichier :file:`MANIFEST.in`, " +"voir :ref:`manifest` pour les détails." #: extending/building.rst:161 msgid "" diff --git a/extending/embedding.po b/extending/embedding.po index 28f1c095..0d155e47 100644 --- a/extending/embedding.po +++ b/extending/embedding.po @@ -6,14 +6,14 @@ msgstr "" "Project-Id-Version: Python 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-15 22:33+0100\n" -"PO-Revision-Date: 2023-02-16 16:53+0100\n" -"Last-Translator: Antoine \n" +"PO-Revision-Date: 2023-07-28 22:36+0200\n" +"Last-Translator: Christophe Nanteuil \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.3\n" +"X-Generator: Poedit 3.2.2\n" #: extending/embedding.rst:8 msgid "Embedding Python in Another Application" @@ -275,7 +275,7 @@ msgstr "" "Bien que le programme soit plutôt gros pour ses fonctionnalités, la plupart " "du code n'est que conversion de données entre Python et C, aussi que pour " "rapporter les erreurs. La partie intéressante, qui concerne l'intégration de " -"Python débute par ::" +"Python débute par ::" #: extending/embedding.rst:178 msgid "" @@ -408,7 +408,7 @@ msgid "" "directly useful to you:" msgstr "" "Pour trouver les bonnes options de compilateur et *linker*, vous pouvez " -"exécuter le script :file:`python(X.Y)-config` généré durant l'installation " +"exécuter le script :file:`python{X.Y}-config` généré durant l'installation " "(un script :file:`python3-config` peut aussi être disponible). Ce script a " "quelques options, celles-ci vous seront utiles :" diff --git a/extending/extending.po b/extending/extending.po index 080dfb49..dc48505b 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: 2023-07-23 14:38+0200\n" -"PO-Revision-Date: 2023-07-21 12:48+0200\n" -"Last-Translator: Julien Palard \n" +"PO-Revision-Date: 2023-11-26 10:23+0100\n" +"Last-Translator: Christophe Nanteuil \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.3\n" +"X-Generator: Poedit 3.2.2\n" #: extending/extending.rst:8 msgid "Extending Python with C or C++" @@ -27,10 +27,10 @@ msgid "" "they can call C library functions and system calls." 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 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." +"savez programmer en C. Ces :dfn:`modules d'extension` permettent deux choses " +"qui ne sont pas possibles directement en Python : ils 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 "" @@ -42,7 +42,7 @@ msgstr "" "Pour gérer les extensions, l'API Python (*Application Programmer Interface*) " "définit un ensemble de fonctions, macros et variables qui donnent accès à la " "plupart des aspects du système d'exécution de Python. L'API Python est " -"incorporée dans un fichier source C en incluant l'en-tête ``\"Python.h\"``." +"incorporée dans un fichier source C en incluant l'en-tête ``Python.h``." #: extending/extending.rst:20 msgid "" @@ -53,6 +53,7 @@ msgstr "" "configuration du système, plus de détails peuvent être trouvés dans les " "chapitres suivants." +# suit un : #: extending/extending.rst:25 msgid "" "The C extension interface is specific to CPython, and extension modules do " @@ -65,15 +66,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 " -"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 " +"l'interface d'extension C est spécifique à *CPython*, et les modules " +"d'extension ne fonctionnent 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,10 +91,10 @@ 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 " -"à la fonction de la bibliothèque C :c:func:`system` [#]_. Cette fonction " -"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 " +"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 à terminaison nulle comme argument et renvoie un " +"entier. Nous voulons que cette fonction soit appelable à partir de Python " "comme suit :" #: extending/extending.rst:53 @@ -103,10 +104,10 @@ msgid "" "`spammodule.c`; if the module name is very long, like ``spammify``, the " "module name can be just :file:`spammify.c`.)" msgstr "" -"Commencez par créer un fichier :file:`spammodule.c`. (Historiquement, si un " +"Commençons par créer un fichier :file:`spammodule.c` (historiquement, si un " "module se nomme ``spam``, le fichier C contenant son implémentation est " -"appelé :file:`spammodule.c`. Si le nom du module est très long, comme " -"``spammify``, le nom du module peut être juste :file:`spammify.c`.)" +"appelé :file:`spammodule.c` ; si le nom du module est très long, comme " +"``spammify``, le nom du module peut être juste :file:`spammify.c`)." #: extending/extending.rst:58 msgid "The first two lines of our file can be::" @@ -120,15 +121,16 @@ msgstr "" "qui récupère l'API Python (vous pouvez ajouter un commentaire décrivant le " "but du module et un avis de droit d'auteur si vous le souhaitez)." +# suit un : #: extending/extending.rst:68 msgid "" "Since Python may define some pre-processor definitions which affect the " "standard headers on some systems, you *must* include :file:`Python.h` before " "any standard headers are included." msgstr "" -"Python pouvant définir certaines définitions pré-processeur qui affectent " -"les têtes standard sur certains systèmes, vous *devez* inclure :file:`Python." -"h` avant les en-têtes standards." +"il est possible que Python déclare certaines définitions pré-processeur qui " +"affectent les têtes standards sur certains systèmes, vous *devez* donc " +"inclure :file:`Python.h` avant les en-têtes standards." #: extending/extending.rst:72 msgid "" @@ -150,9 +152,9 @@ msgid "" "and :c:func:`realloc` directly." 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 " +"``PY``, sauf ceux qui sont définis dans les en-têtes standards. 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 : ````, ````, ```` 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." @@ -207,7 +209,7 @@ msgstr "" "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." +"converties. Nous approfondirons ceci plus tard." #: extending/extending.rst:116 msgid "" @@ -220,17 +222,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 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)." +"les adresses ont été données en entrée. Elle 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 les 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 " @@ -241,18 +242,15 @@ msgid "" "the exception type, exception instance, and a traceback object. 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 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é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 " -"variables sont les équivalents C du résultat de :meth:`sys.exc_info` en " -"Python (voir la section sur le module :mod:`sys` dans *The Python Library " -"Reference*). Il est important de les connaître pour comprendre comment les " -"erreurs sont propagées." +"Une convention importante dans l'interpréteur Python est la suivante : " +"lorsqu'une fonction échoue, elle doit définir une condition d'exception et " +"renvoyer une valeur d'erreur (généralement ``-1`` ou un pointeur ``NULL``). " +"Les informations d'exception sont stockées dans trois attributs de l'état du " +"thread de l'interpréteur. Ils valent ``NULL`` s'il n'y a pas d'exception. " +"Sinon, ce sont les équivalents C des membres du *n*-uplet Python renvoyé " +"par :meth:`sys.exc_info`. Il s'agit du type d'exception, de l'instance " +"d'exception et d'un objet de trace. Il est important de les connaître pour " +"comprendre comment les erreurs sont transmises." #: extending/extending.rst:137 msgid "" @@ -274,7 +272,7 @@ msgstr "" "exception et une chaîne C. L'objet exception est généralement un objet " "prédéfini comme :c:data:`PyExc_ZeroDivisionError`. La chaîne C indique la " "cause de l'erreur et est convertie en une chaîne Python puis stockée en tant " -"que \"valeur associée\" à l'exception." +"que « valeur associée » à l'exception." #: extending/extending.rst:145 msgid "" @@ -307,7 +305,6 @@ msgstr "" "de le déterminer à partir de la valeur renvoyée." #: extending/extending.rst:158 -#, fuzzy msgid "" "When a function *f* that calls another function *g* detects that the latter " "fails, *f* should itself return an error value (usually ``NULL`` or " @@ -322,17 +319,16 @@ 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``). 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." +"appeler l'une des fonctions ``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 ``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:168 -#, fuzzy msgid "" "(There are situations where a module can actually give a more detailed error " "message by calling another ``PyErr_*`` function, and in such cases it is " @@ -341,11 +337,11 @@ msgid "" "can fail for a variety of reasons.)" msgstr "" "(Il y a des situations où un module peut effectivement donner un message " -"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.)" +"d'erreur plus détaillé en appelant une autre fonction ``PyErr_*`` et, 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.)" #: extending/extending.rst:174 msgid "" @@ -356,8 +352,8 @@ msgid "" "itself (possibly by trying something else, or pretending nothing went wrong)." msgstr "" "Pour ignorer une exception qui aurait été émise lors d'un appel de fonction " -"qui aurait échoué, l'exception doit être retirée explicitement en appelant :" -"c:func:`PyErr_Clear`. Le seul cas pour lequel du code C devrait appeler :c:" +"qui a échoué, l'exception doit être retirée explicitement en appelant :c:" +"func:`PyErr_Clear`. Le seul cas pour lequel du code C devrait appeler :c:" "func:`PyErr_Clear` est lorsqu'il ne veut pas passer l'erreur à " "l'interpréteur, mais souhaite la gérer lui-même (peut-être en essayant " "quelque chose d'autre, ou en prétendant que rien n'a mal tourné)." @@ -415,7 +411,7 @@ msgstr "" "correspondant à chaque exception Python, tel que :c:data:" "`PyExc_ZeroDivisionError`, que vous pouvez utiliser directement. Choisissez " "judicieusement vos exceptions, typiquement n'utilisez pas :c:data:" -"`PyExc_TypeError` pour indiquer qu'un fichier n'a pas pu être ouvert (qui " +"`PyExc_TypeError` pour indiquer qu'un fichier n'a pas pu être ouvert (cela " "devrait probablement être :c:data:`PyExc_IOError`). Si quelque chose ne va " "pas avec la liste des arguments, la fonction :c:func:`PyArg_ParseTuple` lève " "habituellement une exception :c:data:`PyExc_TypeError`. Mais si vous avez un " @@ -452,7 +448,6 @@ msgstr "" "``NULL``), voir :ref:`bltin-exceptions`." #: extending/extending.rst:238 -#, fuzzy msgid "" "Note also that the :c:data:`!SpamError` variable retains a reference to the " "newly created exception class; this is intentional! Since the exception " @@ -462,21 +457,21 @@ msgid "" "pointer, C code which raises the exception could cause a core dump or other " "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 " -"nécessaire pour assurer qu'il ne sera pas rejeté, causant :c:data:" -"`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." +"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 enlevée du module par du code externe, une référence à la classe est " +"nécessaire pour assurer qu'elle ne sera pas supprimée par le ramasse-" +"miettes, entraînant que :c:data:`!SpamError` devienne un pointeur dans le " +"vide. Si cela se produisait, le code C qui lève cette exception peut " +"engendrer un *core dump* ou des effets secondaires inattendus." #: extending/extending.rst:245 msgid "" "We discuss the use of ``PyMODINIT_FUNC`` as a function return type later in " "this sample." msgstr "" -"Nous traiterons de l'utilisation de ``PyMODINIT_FUNC`` comme un type de " -"renvoi de fonction plus tard dans cette section." +"Nous traiterons de l'utilisation de ``PyMODINIT_FUNC`` comme type de renvoi " +"de fonction plus tard dans cette section." #: extending/extending.rst:248 msgid "" @@ -499,7 +494,6 @@ msgstr "" "capable de comprendre cette affirmation ::" #: extending/extending.rst:279 -#, 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 " @@ -513,9 +507,9 @@ msgstr "" "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 " +"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 " +"Standard, la variable :c:data:`!command` doit être clairement déclarée comme " "``const char *command``)." #: extending/extending.rst:287 @@ -528,26 +522,24 @@ msgstr "" "`PyArg_ParseTuple` ::" #: extending/extending.rst:292 -#, fuzzy msgid "" "Our :func:`!spam.system` function must return the value of :c:data:`!sts` as " "a Python object. This is done using the function :c:func:" "`PyLong_FromLong`. ::" msgstr "" -"Notre fonction :func:`spam.system` doit renvoyer la valeur de :c:data:`sts` " -"comme un objet Python. Cela est effectué par l'utilisation de la fonction :c:" -"func:`PyLong_FromLong`. ::" +"Notre fonction :func:`!spam.system` doit renvoyer la valeur de :c:data:`!" +"sts` comme un objet Python. Cela est effectué par l'utilisation de la " +"fonction :c:func:`PyLong_FromLong`. ::" #: extending/extending.rst:297 msgid "" "In this case, it will return an integer object. (Yes, even integers are " "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 !)" +"Dans ce cas, elle renvoie un objet de type entier (oui, même les entiers " +"sont des objets, stockés dans le tas, en Python !)." #: extending/extending.rst:300 -#, fuzzy msgid "" "If you have a C function that returns no useful argument (a function " "returning :c:expr:`void`), the corresponding Python function must return " @@ -555,9 +547,9 @@ msgid "" "macro:`Py_RETURN_NONE` macro)::" msgstr "" "Si vous avez une fonction C qui ne renvoie aucun argument utile (une " -"fonction renvoyant :c:type:`void`), la fonction Python correspondante doit " -"renvoyer ``None``. Vous aurez besoin de cette locution pour cela (qui est " -"implémentée par la macro :c:macro:`Py_RETURN_NONE`) ::" +"fonction renvoyant :c:expr:`void`), la fonction Python correspondante doit " +"renvoyer ``None``. Vous aurez besoin de cet idiome pour cela (qui est " +"implémenté par la macro :c:macro:`Py_RETURN_NONE`) ::" #: extending/extending.rst:308 msgid "" @@ -566,8 +558,8 @@ msgid "" "\"error\" in most contexts, as we have seen." msgstr "" ":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, " +"``None``. C'est un authentique objet Python plutôt qu'un pointeur ``NULL`` " +"qui, dans la plupart des situations, signifie qu'une erreur est survenue " "comme nous l'avons vu." #: extending/extending.rst:316 @@ -609,7 +601,6 @@ msgstr "" "fournies plus bas." #: extending/extending.rst:338 -#, fuzzy msgid "" "The :c:macro:`METH_KEYWORDS` bit may be set in the third field if keyword " "arguments should be passed to the function. In this case, the C function " @@ -617,11 +608,12 @@ msgid "" "keywords. Use :c:func:`PyArg_ParseTupleAndKeywords` to parse the arguments " "to such a function." msgstr "" -"Le bit :const:`METH_KEYWORDS` peut être mis à un dans le troisième champ si " -"des arguments par mots-clés doivent être passés à la fonction. Dans ce cas, " -"la fonction C doit accepter un troisième paramètre ``PyObject *`` qui est un " -"dictionnaire des mots-clés. Utilisez :c:func:`PyArg_ParseTupleAndKeywords` " -"pour analyser les arguments d'une telle fonction." +"Le bit :c:macro:`METH_KEYWORDS` peut être mis à un dans le troisième champ " +"si des arguments par mots-clés doivent être passés à la fonction. Dans ce " +"cas, la fonction C doit accepter un troisième paramètre ``PyObject *`` qui " +"est un dictionnaire des mots-clés. Utilisez :c:func:" +"`PyArg_ParseTupleAndKeywords` pour analyser les arguments d'une telle " +"fonction." #: extending/extending.rst:344 msgid "" @@ -649,9 +641,9 @@ msgid "" "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``." +"type ``PyObject *``, déclare également toute déclaration de liaison spéciale " +"requise par la plate-forme et, pour le C++, déclare la fonction comme " +"``extern C``." #: extending/extending.rst:370 msgid "" @@ -667,13 +659,13 @@ msgid "" "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 " +"fois, :c:func:`PyInit_spam` est appelée (voir ci-dessous pour les " +"commentaires sur l'intégration en Python). Elle 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 le tableau (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. Elle 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``." @@ -687,10 +679,11 @@ msgid "" 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 " +"`PyImport_Inittab`. Pour ajouter le module au tableau d'initialisation, " +"utilisez :c:func:`PyImport_AppendInittab`, suivie éventuellement d'une " "importation du module ::" +# suit un : #: extending/extending.rst:425 msgid "" "Removing entries from ``sys.modules`` or importing compiled modules into " @@ -699,12 +692,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." +"supprimer des entrées de ``sys.modules`` ou importer des modules compilés " +"dans plusieurs interpréteurs au sein d'un même processus (ou le faire à la " +"suite d'un :c:func:`fork` sans un :c:func:`exec` préalable) 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:431 msgid "" @@ -716,6 +709,7 @@ msgstr "" "sources Python sous le nom :file:`Modules/xxmodule.c`. Ce fichier peut être " "utilisé comme modèle ou simplement lu comme exemple." +# suit un : #: extending/extending.rst:437 msgid "" "Unlike our ``spam`` example, ``xxmodule`` uses *multi-phase initialization* " @@ -723,11 +717,11 @@ 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 " +"contrairement à notre exemple de ``spam``, ``xxmodule`` utilise une " +"*initialisation multi-phases* (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`." +"l'initialisation multi-phases, voir :PEP:`489`." #: extending/extending.rst:446 msgid "Compilation and Linkage" @@ -742,6 +736,13 @@ msgid "" "`building`) and additional information that pertains only to building on " "Windows (chapter :ref:`building-on-windows`) for more information about this." msgstr "" +"Il y a encore deux choses à faire avant de pouvoir utiliser votre nouvelle " +"extension : la compiler et la lier au système Python. Si vous utilisez le " +"chargement dynamique, les détails peuvent dépendre du style de chargement " +"dynamique utilisé par votre système ; voir les chapitres sur la compilation " +"de modules d'extension (chapitre :ref:`building`) et les informations " +"supplémentaires concernant uniquement la construction sous Windows " +"(chapitre :ref:`building-on-windows`) pour plus d'informations à ce sujet." #: extending/extending.rst:455 msgid "" @@ -752,6 +753,13 @@ msgid "" "the :file:`Modules/` directory of an unpacked source distribution, add a " "line to the file :file:`Modules/Setup.local` describing your file:" msgstr "" +"Si vous ne pouvez pas utiliser le chargement dynamique, ou si vous voulez " +"faire de votre module une partie permanente de l'interpréteur Python, vous " +"devez modifier la configuration et reconstruire l'interpréteur. " +"Heureusement, c'est très simple sous Unix : placez simplement votre fichier " +"(:file:`spammodule.c` par exemple) dans le répertoire :file:`Modules/` d'une " +"distribution source décompressée, ajoutez une ligne au fichier :file:" +"`Modules/Setup.local` décrivant votre fichier :" #: extending/extending.rst:466 msgid "" @@ -761,12 +769,21 @@ msgid "" "running ':program:`make` Makefile'. (This is necessary each time you change " "the :file:`Setup` file.)" msgstr "" +"et reconstruisez l'interpréteur en exécutant :program:`make` dans le " +"répertoire de niveau supérieur. Vous pouvez également exécuter :program:" +"`make` dans le sous-répertoire :file:`Modules/`, mais vous devez d'abord " +"reconstruire le :file:`Makefile` en exécutant « :program:`make` " +"Makefile » (c'est nécessaire chaque fois que vous modifiez le fichier :file:" +"`Setup`)." #: extending/extending.rst:472 msgid "" "If your module requires additional libraries to link with, these can be " "listed on the line in the configuration file as well, for instance:" msgstr "" +"Si votre module nécessite d'être lié à des bibliothèques supplémentaires, " +"celles-ci peuvent être ajoutées à la fin de la ligne de votre module dans le " +"fichier de configuration, par exemple :" #: extending/extending.rst:483 msgid "Calling Python Functions from C" @@ -782,6 +799,14 @@ msgid "" "will require calling the Python callback functions from a C callback. Other " "uses are also imaginable." msgstr "" +"Jusqu'à présent, nous nous sommes concentrés sur le fait de rendre les " +"fonctions C appelables depuis Python. L'inverse est également utile : " +"appeler des fonctions Python depuis C. C'est notamment le cas pour les " +"bibliothèques qui gèrent les fonctions dites de « rappel » (*callback* en " +"anglais). Si une interface C utilise des rappels, l'équivalent Python doit " +"souvent fournir un mécanisme de rappel au développeur Python ; " +"l'implémentation nécessite d'appeler les fonctions de rappel Python à partir " +"d'un rappel C. D'autres utilisations sont également envisageables." #: extending/extending.rst:493 msgid "" @@ -791,6 +816,12 @@ msgid "" "interested, have a look at the implementation of the :option:`-c` command " "line option in :file:`Modules/main.c` from the Python source code.)" msgstr "" +"Heureusement, l'interpréteur Python est facilement appelé de manière " +"récursive et il existe une interface standard pour appeler une fonction " +"Python (nous ne nous attarderons pas sur la façon d'appeler l'analyseur " +"Python avec une chaîne particulière en entrée — si vous êtes intéressé, " +"jetez un œil à l'implémentation de l'option de ligne de commande :option:`-" +"c` dans :file:`Modules/main.c` à partir du code source Python)." #: extending/extending.rst:499 msgid "" @@ -801,16 +832,22 @@ msgid "" "global variable --- or wherever you see fit. For example, the following " "function might be part of a module definition::" msgstr "" +"L'appel d'une fonction Python est facile. Tout d'abord, le programme Python " +"doit vous transmettre d'une manière ou d'une autre l'objet de fonction " +"Python. Vous devez fournir une fonction (ou une autre interface) pour ce " +"faire. Lorsque cette fonction est appelée, enregistrez un pointeur vers " +"l'objet de la fonction Python (faites attention à :c:func:`Py_INCREF` !) " +"dans une variable globale — ou là où vous le souhaitez. Par exemple, la " +"fonction suivante peut faire partie d'une définition de module ::" #: extending/extending.rst:529 -#, fuzzy msgid "" "This function must be registered with the interpreter using the :c:macro:" "`METH_VARARGS` flag; this is described in section :ref:`methodtable`. The :" "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:" +"Cette fonction doit être déclarée en utilisant le drapeau :c:macro:" "`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`." @@ -839,6 +876,16 @@ msgid "" "func:`Py_BuildValue` returns a tuple when its format string consists of zero " "or more format codes between parentheses. For example::" msgstr "" +"Plus tard, quand il est temps d'appeler la fonction, vous appelez la " +"fonction C :c:func:`PyObject_CallObject`. Cette fonction requiert deux " +"arguments, tous deux des pointeurs vers des objets Python arbitraires : la " +"fonction Python et la liste d'arguments. La liste d'arguments doit toujours " +"être un objet *n*-uplet, dont la longueur est le nombre d'arguments. Pour " +"appeler la fonction Python sans argument, passez ``NULL`` ou le *n*-uplet " +"vide ; pour l'appeler avec un argument, passez un *n*-uplet singleton. :c:" +"func:`Py_BuildValue` renvoie un *n*-uplet lorsque sa chaîne de format se " +"compose de zéro ou plusieurs codes de format entre parenthèses. Par " +"exemple ::" #: extending/extending.rst:561 msgid "" @@ -848,6 +895,12 @@ msgid "" "new tuple was created to serve as the argument list, which is :c:func:" "`Py_DECREF`\\ -ed immediately after the :c:func:`PyObject_CallObject` call." msgstr "" +":c:func:`PyObject_CallObject` renvoie un pointeur d'objet Python : c'est la " +"valeur de retour de la fonction Python. :c:func:`PyObject_CallObject` est " +"« neutre en nombre de références » par rapport à ses arguments. Dans " +"l'exemple, un nouveau *n*-uplet a été créé pour servir de liste d'arguments, " +"qui est décrémenté (avec :c:func:`Py_DECREF`) immédiatement après l'appel :c:" +"func:`PyObject_CallObject`." #: extending/extending.rst:568 msgid "" @@ -857,6 +910,12 @@ msgid "" "should somehow :c:func:`Py_DECREF` the result, even (especially!) if you are " "not interested in its value." msgstr "" +"La valeur de retour de :c:func:`PyObject_CallObject` est « nouvelle » : soit " +"c'est un tout nouvel objet, soit c'est un objet existant dont le nombre de " +"références a été incrémenté. Donc, à moins que vous ne vouliez l'enregistrer " +"dans une variable globale, vous devriez en quelque sorte décrémenter avec :c:" +"func:`Py_DECREF` le résultat, même (surtout !) si vous n'êtes pas intéressé " +"par sa valeur." #: extending/extending.rst:574 msgid "" @@ -870,7 +929,7 @@ msgid "" 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:" +"une levée d'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 " @@ -895,7 +954,7 @@ msgstr "" "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 " +"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 ::" @@ -907,6 +966,10 @@ msgid "" "complete: :c:func:`Py_BuildValue` may run out of memory, and this should be " "checked." msgstr "" +"Notez la présence de ``Py_DECREF(arglist)`` immédiatement après l'appel, " +"avant la vérification des erreurs ! Notez également qu'à proprement parler, " +"ce code n'est pas complet : :c:func:`Py_BuildValue` peut manquer de mémoire, " +"et cela doit être vérifié." #: extending/extending.rst:610 msgid "" @@ -935,6 +998,11 @@ msgid "" "Reference Manual. The remaining arguments must be addresses of variables " "whose type is determined by the format string." msgstr "" +"L'argument *arg* doit être un *n*-uplet contenant une liste d'arguments " +"passée de Python à une fonction C. L'argument *format* doit être une chaîne " +"de format, dont la syntaxe est expliquée dans :ref:`arg-parsing` dans le " +"manuel de référence de l'API Python/C. Les arguments restants doivent être " +"des adresses de variables dont le type est déterminé par la chaîne de format." #: extending/extending.rst:642 msgid "" @@ -943,15 +1011,19 @@ msgid "" "variables passed to the call: if you make mistakes there, your code will " "probably crash or at least overwrite random bits in memory. So be careful!" msgstr "" +"Notez que si :c:func:`PyArg_ParseTuple` vérifie que les arguments Python ont " +"les types requis, elle ne peut pas vérifier la validité des adresses des " +"variables C transmises à l'appel : si vous y faites des erreurs, votre code " +"plantera probablement ou au moins écrasera des bits aléatoires en mémoire. " +"Donc soyez prudent !" #: extending/extending.rst:647 msgid "" "Note that any Python object references which are provided to the caller are " "*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 !" +"Notez que toute référence sur un objet Python donnée à l'appelant est une " +"référence *empruntée* ; ne décrémentez pas son compteur de références !" #: extending/extending.rst:650 msgid "Some example calls::" @@ -984,26 +1056,27 @@ msgstr "" "*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 " +"processus, :c:func:`PyArg_ParseTupleAndKeywords` renvoie vrai, sinon elle " "renvoie faux et lève une exception appropriée." +# suit un : #: extending/extending.rst:739 msgid "" "Nested tuples cannot be parsed when using keyword arguments! Keyword " "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." +"les *n*-uplets imbriqués ne peuvent pas être traités lorsqu'on utilise des " +"arguments nommés ! Ceux-ci doivent apparaître dans *kwlist*, dans le cas " +"contraire une exception :exc:`TypeError` est levée." #: extending/extending.rst:745 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) ::" +"Voici un exemple de module qui utilise des arguments nommés, basé sur un " +"exemple de *Geoff Philbrick* (philbrick@hks.com) ::" #: extending/extending.rst:800 msgid "Building Arbitrary Values" @@ -1024,14 +1097,13 @@ 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 " +"Elle 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." +"entrée de la fonction, et non de la sortie) ne doivent pas être des " +"pointeurs, mais juste des valeurs. Elle renvoie un nouvel objet Python, " +"adapté pour être renvoyé par une fonction C appelée depuis Python." #: extending/extending.rst:812 -#, 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 " @@ -1042,9 +1114,15 @@ 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 " +"Une différence avec :c:func:`PyArg_ParseTuple` : alors que cette dernière " +"nécessite que son premier argument soit un *n*-uplet (puisque les listes " +"d'arguments Python sont toujours représentées comme des *n*-uplets en " +"interne), :c:func:`Py_BuildValue` ne construit pas toujours un *n*-uplet. " +"Elle construit un *n*-uplet uniquement si sa chaîne de format contient deux " +"unités de format ou plus. Si la chaîne de format est vide, elle renvoie " +"``None`` ; si elle contient exactement une unité de format, elle renvoie " +"tout objet décrit par cette unité de format. Pour la forcer à renvoyer un " +"*n*-uplet de taille 0 ou un, mettez la chaîne de format entre parenthèses." #: extending/extending.rst:820 msgid "" @@ -1085,6 +1163,17 @@ msgid "" "as referencing uninitialized data --- core dumps, wrong results, mysterious " "crashes." msgstr "" +"Chaque bloc de mémoire alloué avec :c:func:`malloc` doit finalement être " +"libéré par exactement un appel à :c:func:`free`. Il est important d'appeler :" +"c:func:`free` au bon moment. Si l'adresse d'un bloc est oubliée mais que :c:" +"func:`free` n'est pas appelée, la mémoire qu'il occupe ne peut être " +"réutilisée tant que le programme n'est pas terminé. C'est ce qu'on appelle " +"une :dfn:`fuite de mémoire`. D'autre part, si un programme appelle :c:func:" +"`free` pour un bloc et continue ensuite à utiliser le bloc, il crée un " +"conflit avec la réutilisation du bloc via un autre appel :c:func:`malloc`. " +"Cela s'appelle :dfn:`utiliser de la mémoire libérée`. Cela a les mêmes " +"conséquences néfastes que le référencement de données non initialisées — " +"« *core dumps* », résultats erronés, plantages mystérieux." #: extending/extending.rst:865 msgid "" @@ -1102,6 +1191,20 @@ msgid "" "happening by having a coding convention or strategy that minimizes this kind " "of errors." msgstr "" +"Les causes courantes des fuites de mémoire sont des exécutions inhabituelles " +"du code. Par exemple, une fonction peut allouer un bloc de mémoire, " +"effectuer des calculs, puis libérer le bloc. Plus tard, une modification des " +"exigences de la fonction peut ajouter un test au calcul qui détecte une " +"condition d'erreur et peut sortir prématurément de la fonction. Il est " +"facile d'oublier de libérer le bloc de mémoire alloué lors de cette sortie " +"prématurée, surtout lorsqu'elle est ajoutée ultérieurement au code. De " +"telles fuites, une fois introduites, passent souvent inaperçues pendant " +"longtemps : la sortie d'erreur n'est prise que dans une petite fraction de " +"tous les appels, et la plupart des machines modernes ont beaucoup de mémoire " +"virtuelle, de sorte que la fuite ne devient apparente que dans un processus " +"de longue durée qui utilise fréquemment cette fonction. Par conséquent, il " +"est important d'éviter les fuites en ayant une convention ou une stratégie " +"de codage qui minimise ce type d'erreurs." #: extending/extending.rst:878 msgid "" @@ -1115,9 +1218,9 @@ msgid "" 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 " +"que l'utilisation de la mémoire libérée. La méthode choisie est appelée le :" +"dfn:`comptage de références`. 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é." @@ -1137,19 +1240,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." +"Une stratégie alternative est appelée :dfn:`ramasse-miettes automatique` " +"(*automatic garbage collection* en anglais). 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` sont 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 devons utiliser les compteurs de références." #: extending/extending.rst:898 msgid "" @@ -1165,17 +1268,17 @@ msgid "" "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." +"références, il contient également un détecteur de cycles qui fonctionne pour " +"détecter les cycles de références. Cela permet aux applications de ne pas se " +"soucier de la création de références circulaires directes ou indirectes ; " +"celles-ci sont les faiblesses des ramasse-miettes utilisant uniquement le " +"comptage de références. Les cycles de références 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 compteur de références qui n'est pas " +"nul. Les implémentations typiques de comptage de références ne sont pas " +"capables de récupérer la mémoire des objets appartenant à un cycle de " +"références, ou référencés à partir des objets dans le cycle, même s'il n'y a " +"pas d'autre référence au cycle lui-même." #: extending/extending.rst:909 msgid "" @@ -1184,6 +1287,11 @@ msgid "" "collect` function), as well as configuration interfaces and the ability to " "disable the detector at runtime." msgstr "" +"Le détecteur de cycle est capable de détecter les cycles isolés et peut " +"récupérer la mémoire afférente. Le module :mod:`gc` expose un moyen " +"d'exécuter le détecteur (la fonction :func:`~gc.collect`), ainsi que des " +"interfaces de configuration et la possibilité de désactiver le détecteur au " +"moment de l'exécution." #: extending/extending.rst:918 msgid "Reference Counting in Python" @@ -1200,8 +1308,8 @@ msgid "" "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 " +"l'incrémentation et la décrémentation du comptage de références. :c:func:" +"`Py_DECREF` libère également l'objet lorsque le compteur 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 " @@ -1222,13 +1330,13 @@ 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 " +"compteur 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." +"nécessaire. La possession d'une référence peut être transférée. Il y a trois " +"façons de se débarrasser d'une référence que l'on possède : 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:936 msgid "" @@ -1238,6 +1346,12 @@ msgid "" "borrowed. Using a borrowed reference after the owner has disposed of it " "risks using freed memory and should be avoided completely [#]_." msgstr "" +"Il est également possible d':dfn:`emprunter` [#]_ une référence à un objet. " +"L'emprunteur d'une référence ne doit pas appeler :c:func:`Py_DECREF`. " +"L'emprunteur ne doit pas conserver l'objet plus longtemps que le " +"propriétaire à qui il a été emprunté. L'utilisation d'une référence " +"empruntée après que le propriétaire s'en est débarrassée risque d'utiliser " +"de la mémoire libérée et doit être absolument évitée [#]_." #: extending/extending.rst:942 msgid "" @@ -1249,14 +1363,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." +"L'avantage d'emprunter, plutôt qu'être propriétaire d'une référence, est que " +"vous n'avez pas à vous soucier de libérer 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:950 msgid "" @@ -1266,10 +1380,15 @@ msgid "" "full owner responsibilities (the new owner must dispose of the reference " "properly, as well as the previous owner)." msgstr "" +"Une référence empruntée peut être changée en une référence possédée en " +"appelant :c:func:`Py_INCREF`. Cela n'affecte pas le statut du propriétaire à " +"qui la référence a été empruntée — cela crée une nouvelle référence possédée " +"et donne l'entière responsabilité au propriétaire (le nouveau propriétaire " +"doit libérer la référence correctement, ainsi que le propriétaire précédent)." #: extending/extending.rst:960 msgid "Ownership Rules" -msgstr "Règles concernant la propriété de références" +msgstr "Règles concernant la possession de références" #: extending/extending.rst:962 msgid "" @@ -1279,7 +1398,7 @@ msgid "" 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 " +"l'interface de la fonction, peu importe que la possession soit transférée " "avec la référence ou non." #: extending/extending.rst:966 @@ -1292,6 +1411,14 @@ msgid "" "func:`PyLong_FromLong` maintains a cache of popular values and can return a " "reference to a cached item." msgstr "" +"La plupart des fonctions qui renvoient une référence à un objet transmettent " +"la possession avec la référence. En particulier, toutes les fonctions dont " +"la fonction est de créer un nouvel objet, telles que :c:func:" +"`PyLong_FromLong` et :c:func:`Py_BuildValue`, transmettent la possession au " +"récepteur. Même si l'objet n'est pas réellement nouveau, vous recevez " +"toujours la possession d'une nouvelle référence à cet objet. Par exemple, :c:" +"func:`PyLong_FromLong` maintient un cache des valeurs souvent utilisées et " +"peut renvoyer une référence à un élément mis en cache." #: extending/extending.rst:974 msgid "" @@ -1303,6 +1430,13 @@ msgid "" "`PyDict_GetItemString` all return references that you borrow from the tuple, " "list or dictionary." msgstr "" +"De nombreuses fonctions qui extraient des objets d'autres objets transfèrent " +"également la possession avec la référence, par exemple :c:func:" +"`PyObject_GetAttrString`. L'image est moins claire ici, cependant, puisque " +"quelques routines courantes sont des exceptions : :c:func:" +"`PyTuple_GetItem`, :c:func:`PyList_GetItem`, :c:func:`PyDict_GetItem` et :c:" +"func:`PyDict_GetItemString` renvoient toutes des références qui sont " +"empruntées au *n*-uplet, à la liste ou au dictionnaire." #: extending/extending.rst:981 msgid "" @@ -1310,6 +1444,9 @@ msgid "" "even though it may actually create the object it returns: this is possible " "because an owned reference to the object is stored in ``sys.modules``." msgstr "" +"La fonction :c:func:`PyImport_AddModule` renvoie également une référence " +"empruntée, même si elle peut en fait créer l'objet qu'elle renvoie : c'est " +"possible car une référence à l'objet est stockée dans ``sys.modules``." #: extending/extending.rst:985 msgid "" @@ -1321,6 +1458,14 @@ msgid "" "them --- even if they fail! (Note that :c:func:`PyDict_SetItem` and friends " "don't take over ownership --- they are \"normal.\")" msgstr "" +"Lorsque vous passez une référence d'objet dans une autre fonction, en " +"général, la fonction vous emprunte la référence — si elle a besoin de la " +"stocker, elle utilise :c:func:`Py_INCREF` pour devenir un propriétaire " +"indépendant. Il existe exactement deux exceptions importantes à cette " +"règle : :c:func:`PyTuple_SetItem` et :c:func:`PyList_SetItem`. Ces fonctions " +"s'approprient l'élément qui leur est transmis, même en cas d'échec ! (Notez " +"que :c:func:`PyDict_SetItem` et compagnie ne prennent pas la possession de " +"l'objet, elles sont « normales ».)" #: extending/extending.rst:993 msgid "" @@ -1330,6 +1475,12 @@ msgid "" "Only when such a borrowed reference must be stored or passed on, it must be " "turned into an owned reference by calling :c:func:`Py_INCREF`." msgstr "" +"Lorsqu'une fonction C est appelée depuis Python, elle emprunte à l'appelant " +"des références aux arguments. L'appelant possède une référence à l'objet, de " +"sorte que la durée de vie de la référence empruntée est garantie jusqu'au " +"retour de la fonction. Ce n'est que lorsqu'une telle référence empruntée " +"doit être stockée ou transmise qu'elle doit être transformée en référence " +"possédée en appelant :c:func:`Py_INCREF`." #: extending/extending.rst:999 msgid "" @@ -1337,6 +1488,9 @@ msgid "" "must be an owned reference --- ownership is transferred from the function to " "its caller." msgstr "" +"La référence d'objet renvoyée par une fonction C appelée depuis Python doit " +"être une référence détenue en propre — la possession est transférée de la " +"fonction à son appelant." #: extending/extending.rst:1007 msgid "Thin Ice" @@ -1351,7 +1505,7 @@ msgid "" 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 " +"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:1013 @@ -1360,8 +1514,8 @@ 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 " +"Le premier cas, et le plus important à connaître, est celui de l'utilisation " +"de :c:func:`Py_DECREF` à un objet non relié lors de l'emprunt d'une " "référence à un élément de liste. Par exemple ::" #: extending/extending.rst:1025 @@ -1414,6 +1568,9 @@ msgid "" "The solution, once you know the source of the problem, is easy: temporarily " "increment the reference count. The correct version of the function reads::" msgstr "" +"La solution, une fois que vous connaissez la source du problème, est " +"simple : incrémentez temporairement le compteur de références. La version " +"correcte de la fonction est ::" #: extending/extending.rst:1058 msgid "" @@ -1421,6 +1578,10 @@ msgid "" "bug and someone spent a considerable amount of time in a C debugger to " "figure out why his :meth:`__del__` methods would fail..." msgstr "" +"C'est une histoire vraie. Une ancienne version de Python contenait des " +"variantes de ce bogue et quelqu'un a passé beaucoup de temps dans un " +"débogueur C pour comprendre pourquoi il arrivait que ses méthodes :meth:" +"`__del__` échouent…" #: extending/extending.rst:1062 msgid "" @@ -1435,7 +1596,7 @@ msgid "" "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 " +"impliquant des fils d'exécution. 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:" @@ -1477,7 +1638,7 @@ 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 : " +"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." @@ -1499,6 +1660,12 @@ msgid "" "expected types, and this would generate redundant tests. There are no " "variants with ``NULL`` checking." msgstr "" +"Les macros de vérification d'un type d'objet particulier " +"(``Pytype_Check()``) ne vérifient pas les pointeurs ``NULL`` — encore une " +"fois, il y a beaucoup de code qui en appelle plusieurs à la suite pour " +"tester un objet par rapport à différents types attendus, ce qui générerait " +"des tests redondants. Il n'y a pas de variantes avec la vérification " +"``NULL``." #: extending/extending.rst:1109 msgid "" @@ -1508,14 +1675,14 @@ msgid "" 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 [#]_." +"il garantit qu'il s'agit toujours d'un *n*-uplet [#]_." #: extending/extending.rst:1113 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\" à " +"C'est une grave erreur de laisser un pointeur ``NULL`` « s'échapper » vers " "l'utilisateur Python." #: extending/extending.rst:1124 @@ -1564,7 +1731,7 @@ msgstr "" "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 " +"« 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 " @@ -1586,7 +1753,7 @@ msgid "" "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 " +"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 " @@ -1629,6 +1796,15 @@ msgid "" "module, retrieve the value of this name, and then retrieve the pointer from " "the Capsule." msgstr "" +"Python fournit un mécanisme spécial pour transmettre des informations de " +"niveau C (pointeurs) d'un module d'extension à un autre : les Capsules. Une " +"capsule est un type de données Python qui stocke un pointeur (:c:expr:`void " +"\\*`). Les capsules ne peuvent être créées et accessibles que via leur API " +"C, mais elles peuvent être transmises comme n'importe quel autre objet " +"Python. En particulier, elles peuvent être affectées à un nom dans l'espace " +"de noms d'un module d'extension. D'autres modules d'extension peuvent alors " +"importer ce module, récupérer la valeur de ce nom, puis récupérer le " +"pointeur de la Capsule." #: extending/extending.rst:1180 msgid "" @@ -1648,7 +1824,6 @@ msgstr "" "clients." #: extending/extending.rst:1186 -#, 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:expr:`const " @@ -1659,34 +1834,34 @@ msgid "" 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 " +"nommé (:c:expr:`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." +"distinguer deux ou plusieurs Capsules non nommées entre elles." #: extending/extending.rst:1193 msgid "" "In particular, Capsules used to expose C APIs should be given a name " "following this convention::" msgstr "" +"En particulier, les capsules utilisées pour exposer les API C doivent " +"recevoir un nom suivant cette convention ::" #: extending/extending.rst:1198 -#, 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 " +"La fonction de commodité :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:1203 -#, fuzzy msgid "" "The following example demonstrates an approach that puts most of the burden " "on the writer of the exporting module, which is appropriate for commonly " @@ -1700,7 +1875,7 @@ msgstr "" "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 " +"pointeurs :c:expr:`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." @@ -1727,6 +1902,8 @@ msgid "" "The function :c:func:`PySpam_System` is a plain C function, declared " "``static`` like everything else::" msgstr "" +"La fonction :c:func:`PySpam_System` est une simple fonction C, déclarée " +"``static`` comme tout le reste ::" #: extending/extending.rst:1227 msgid "The function :c:func:`spam_system` is modified in a trivial way::" @@ -1734,7 +1911,7 @@ msgstr "La fonction :c:func:`spam_system` est modifiée de manière simple ::" #: extending/extending.rst:1241 msgid "In the beginning of the module, right after the line ::" -msgstr "Au début du module, immédiatement après la ligne ::" +msgstr "Au début du module, immédiatement après la ligne ::" #: extending/extending.rst:1245 msgid "two more lines must be added::" @@ -1798,13 +1975,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)." +"Enfin, il convient de mentionner que les 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:1364 msgid "Footnotes" @@ -1847,16 +2024,16 @@ msgstr "" #: extending/extending.rst:539 msgid "PyObject_CallObject()" -msgstr "" +msgstr "PyObject_CallObject()" #: extending/extending.rst:630 msgid "PyArg_ParseTuple()" -msgstr "" +msgstr "PyArg_ParseTuple()" #: extending/extending.rst:722 msgid "PyArg_ParseTupleAndKeywords()" -msgstr "" +msgstr "PyArg_ParseTupleAndKeywords()" #: extending/extending.rst:743 msgid "Philbrick, Geoff" -msgstr "" +msgstr "Philbrick, Geoff" diff --git a/extending/newtypes_tutorial.po b/extending/newtypes_tutorial.po index 64b457cf..a2202aec 100644 --- a/extending/newtypes_tutorial.po +++ b/extending/newtypes_tutorial.po @@ -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 \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 \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 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 ` 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 `." +# 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 `_." 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 `_." +# 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 ` 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 ` 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 ` 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." diff --git a/extending/windows.po b/extending/windows.po index cb008258..78d76b14 100644 --- a/extending/windows.po +++ b/extending/windows.po @@ -6,13 +6,14 @@ msgstr "" "Project-Id-Version: Python 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-21 14:55+0200\n" -"PO-Revision-Date: 2020-06-28 15:18+0200\n" -"Last-Translator: Julien Palard \n" +"PO-Revision-Date: 2023-07-28 22:32+0200\n" +"Last-Translator: Christophe Nanteuil \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 3.2.2\n" #: extending/windows.rst:8 msgid "Building C and C++ Extensions on Windows" @@ -44,7 +45,7 @@ msgstr "" "Les auteurs de modules sont invités à utiliser l'approche *distutils* pour " "construire des modules d'extension, au lieu de celle décrite dans cette " "section. Vous aurez toujours besoin du compilateur C utilisé pour construire " -"Python ; typiquement Microsoft Visual C++." +"Python ; typiquement Microsoft Visual C++." #: extending/windows.rst:24 msgid "" @@ -57,7 +58,7 @@ msgid "" msgstr "" "Cette page mentionne plusieurs noms de fichiers comprenant un numéro de " "version Python encodé. Ces noms de fichiers sont construits sous le format " -"de version ``XY`` ; en pratique, ``'X'`` représente le numéro de version " +"de version ``XY`` ; en pratique, ``'X'`` représente le numéro de version " "majeure et ``'Y'`` représente le numéro de version mineure de la version " "Python avec laquelle vous travaillez. Par exemple, si vous utilisez Python " "2.2.1, ``XY`` correspond à ``22``." @@ -67,7 +68,6 @@ msgid "A Cookbook Approach" msgstr "Une approche \"recette de cuisine\"" #: extending/windows.rst:36 -#, fuzzy msgid "" "There are two approaches to building extension modules on Windows, just as " "there are on Unix: use the :mod:`distutils` package to control the build " @@ -79,9 +79,9 @@ msgid "" "library module." msgstr "" "Il y a deux approches lorsque l'on construit des modules d'extension sur " -"Windows, tout comme sur Unix : utiliser le paquet :mod:`distutils` pour " +"Windows, tout comme sur Unix : utiliser le paquet :mod:`distutils` pour " "contrôler le processus de construction, ou faire les choses manuellement. " -"L'approche *distutils* fonctionne bien pour la plupart des extensions ; la " +"L'approche *distutils* fonctionne bien pour la plupart des extensions ; la " "documentation pour utiliser :mod:`distutils` pour construire et empaqueter " "les modules d'extension est disponible dans :ref:`distutils-index`. Si vous " "considérez que vous avez réellement besoin de faire les choses manuellement, " @@ -131,10 +131,10 @@ msgid "" "data." msgstr "" "Sur Windows, un fichier bibliothèque de liens dynamiques (:file:`.dll`) n'a " -"pas de références paresseuses. A la place, un accès aux fonctions ou données " +"pas de références paresseuses. À la place, un accès aux fonctions ou données " "passe par une table de conversion. Cela est fait pour que le code DLL ne " "doive pas être réarrangé à l'exécution pour renvoyer à la mémoire du " -"programme ; à la place, le code utilise déjà la table de conversion DLL, et " +"programme ; à la place, le code utilise déjà la table de conversion DLL, et " "cette table est modifiée à l'exécution pour pointer vers les fonctions et " "données." @@ -151,7 +151,7 @@ msgstr "" "contient du code venant de plusieurs fichiers objets (:file:`.o`). Durant " "l'étape de liaison pour créer un fichier objet partagé (:file:`.so`), le " "lieur peut informer qu'il ne sait pas où un identificateur est défini. Le " -"lieur le cherchera dans les fichiers objet dans les bibliothèques ; s'il le " +"lieur le cherchera dans les fichiers objet dans les bibliothèques ; s'il le " "trouve, il inclura tout le code provenant de ce fichier objet." #: extending/windows.rst:76 @@ -169,7 +169,7 @@ msgid "" msgstr "" "Sur Windows, il y a deux types de bibliothèques, une bibliothèque statique " "et une bibliothèque d'importation (toutes deux appelées :file:`.lib`). Une " -"bibliothèque statique est comme un fichier Unix :file:`.a` ; elle contient " +"bibliothèque statique est comme un fichier Unix :file:`.a` ; elle contient " "du code pouvant être inclus si nécessaire. Une bibliothèque d'importation " "est uniquement utilisée pour rassurer le lieur qu'un certain identificateur " "est légal, et sera présent dans le programme quand la DLL est chargée. Comme " @@ -193,10 +193,10 @@ msgstr "" "Supposons que vous construisez deux modules de chargement dynamiques, B et " "C, qui ne devraient pas partager un autre bloc de code avec A. Sur Unix, " "vous ne transmettrez pas :file:`A.a` au lieur pour :file:`B.so` et :file:`C." -"so` ; cela le ferait être inclus deux fois, pour que B et C aient chacun " +"so` ; cela le ferait être inclus deux fois, pour que B et C aient chacun " "leur propre copie. Sur Windows, construire :file:`A.dll` construira aussi :" "file:`A.lib`. Vous transmettez :file:`A.lib` au lieur pour B et C. :file:`A." -"lib` ne contient pas de code ; il contient uniquement des informations qui " +"lib` ne contient pas de code ; il contient uniquement des informations qui " "seront utilisées lors de l'exécution pour accéder au code de A." #: extending/windows.rst:94 @@ -207,23 +207,22 @@ msgid "" "create a separate copy." msgstr "" "Sur Windows, utiliser une bibliothèque d'importation est comme utiliser " -"``import spam``; cela vous donne accès aux noms des spams, mais ne crée par " +"``import spam`` ; cela vous donne accès aux noms des spams, mais ne crée par " "de copie séparée. Sur Unix, se lier à une bibliothèque est plus comme ``from " -"spam import *`` ; cela crée une copie séparée." +"spam import *`` ; cela crée une copie séparée." #: extending/windows.rst:103 msgid "Using DLLs in Practice" msgstr "Utiliser les DLL en pratique" #: extending/windows.rst:108 -#, fuzzy msgid "" "Windows Python is built in Microsoft Visual C++; using other compilers may " "or may not work. The rest of this section is MSVC++ specific." msgstr "" -"Le Python de Windows est construit en Microsoft Visual C++ ; utiliser " -"d'autres compilateurs pourrait fonctionner, ou pas (cependant Borland a " -"l'air de fonctionner). Le reste de cette section est spécifique à MSVC++." +"Le Python de Windows est construit en Microsoft Visual C++ ; utiliser " +"d'autres compilateurs pourrait fonctionner, ou pas. Le reste de cette " +"section est spécifique à MSVC++." #: extending/windows.rst:111 msgid "" @@ -242,7 +241,7 @@ msgid "" "functions (such as :c:func:`PyArg_ParseTuple`), but it does know how to find " "the Python code thanks to :file:`pythonXY.lib`." msgstr "" -"La première commande a créé trois fichiers : :file:`spam.obj`, :file:`spam." +"La première commande a créé trois fichiers : :file:`spam.obj`, :file:`spam." "dll` et :file:`spam.lib`. :file:`Spam.dll` ne contient pas de fonctions " "Python (telles que :c:func:`PyArg_ParseTuple`), mais il sait comment trouver " "le code Python grâce à :file:`pythonXY.lib`." diff --git a/library/shutil.po b/library/shutil.po index 4abb3d57..168a16b7 100644 --- a/library/shutil.po +++ b/library/shutil.po @@ -6,7 +6,7 @@ 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: 2023-11-23 09:37-0700\n" +"PO-Revision-Date: 2023-11-26 16:20+0100\n" "Last-Translator: Yannick Gingras \n" "Language-Team: FRENCH \n" "Language: fr\n" @@ -88,8 +88,8 @@ msgid "" msgstr "" "Copie le contenu (sans métadonnées) du fichier nommé *src* dans un fichier " "nommé *dst* et renvoie *dst* de la manière la plus efficace possible. Les " -"paramètres *src* et *dst* sont des :term:`objets simili-chemin ` ou des chaînes spécifiant des chemins." +"paramètres *src* et *dst* sont des objets simili-chemin ou des chaînes " +"spécifiant des chemins." #: library/shutil.rst:57 msgid "" diff --git a/library/zipimport.po b/library/zipimport.po index 58dbf411..1382dca1 100644 --- a/library/zipimport.po +++ b/library/zipimport.po @@ -6,18 +6,18 @@ msgstr "" "Project-Id-Version: Python 3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-31 11:33+0100\n" -"PO-Revision-Date: 2021-11-08 15:03+0100\n" +"PO-Revision-Date: 2023-07-24 13:50+0200\n" "Last-Translator: Jean Abou Samra \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 3.0\n" +"X-Generator: Poedit 3.3.1\n" #: library/zipimport.rst:2 msgid ":mod:`zipimport` --- Import modules from Zip archives" -msgstr ":mod:`zipimport` — Importer des modules à partir d'archives Zip" +msgstr ":mod:`zipimport` — Import de modules à partir d'archives Zip" #: library/zipimport.rst:9 msgid "**Source code:** :source:`Lib/zipimport.py`" @@ -58,7 +58,6 @@ msgstr "" "répertoire :file:`lib/` dans l'archive." #: library/zipimport.rst:26 -#, fuzzy msgid "" "Any files may be present in the ZIP archive, but importers are only invoked " "for :file:`.py` and :file:`.pyc` files. ZIP import of dynamic modules (:" @@ -67,19 +66,20 @@ msgid "" "adding the corresponding :file:`.pyc` file, meaning that if a ZIP archive " "doesn't contain :file:`.pyc` files, importing may be rather slow." msgstr "" -"Tous les fichiers peuvent être présents dans l'archive ZIP, mais seuls les " -"fichiers :file:`.py` et :file:`.pyc` sont disponibles pour importation. " -"L'importation ZIP des modules dynamiques (:file:`.pyd`, :file:`.so`) n'est " -"pas permise. Notez que si une archive ne contient que des fichiers :file:`." -"py`, Python n'essaiera pas de modifier l'archive en ajoutant le fichier " -"correspondant :file:`.pyc`, ce qui signifie que si une archive ZIP ne " -"contient pas de fichier :file:`.pyc`, l'importation peut être assez lente." +"Tous les fichiers peuvent être présents dans l'archive ZIP, mais les " +"importateurs ne sont invoqués que pour les fichiers :file:`.py` et :file:`." +"pyc`. L'importation ZIP de modules dynamiques (:file:`.py`, :file:`.so`) " +"n'est pas permise. Notez que si une archive ne contient que des fichiers :" +"file:`.py`, Python n'essaiera pas de modifier l'archive en ajoutant le " +"fichier :file:`.pyc` correspondant, ce qui signifie que si une archive ZIP " +"ne contient pas de fichiers :file:`.pyc`, l'importation peut être assez " +"lente." #: library/zipimport.rst:33 msgid "Previously, ZIP archives with an archive comment were not supported." msgstr "" -"auparavant, les archives ZIP avec un commentaire n'étaient pas prises en " -"charge." +"auparavant, les archives ZIP avec un commentaire d’archive n’étaient pas " +"prises en charge." #: library/zipimport.rst:40 msgid ""