{"title":"Passage à Python 3","version":"1.9","locale":"fr","docname":"topics/python3","url":"/fr/1.9/topics/python3/","canonical":"https://djangodocs.dev/fr/1.9/topics/python3/","summary":"Django 1.5 est la première version de Django à prendre en charge Python 3. Le même code fonctionne aussi bien avec Python 2 (≥ 2.6.5) qu’avec Python 3 (≥ 3.2),…","html":"<h1>Passage à Python 3<a class=\"heading-anchor\" href=\"#porting-to-python-3\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 1.5 est la première version de Django à prendre en charge Python 3. Le même code fonctionne aussi bien avec Python 2 (≥ 2.6.5) qu’avec Python 3 (≥ 3.2), grâce à la couche de compatibilité offerte par <a class=\"reference external\" href=\"https://pythonhosted.org/six/\">six</a>.</p>\n<p>Ce document est principalement destiné aux rédacteurs d’applications réutilisables qui souhaitent prendre en charge à la fois Python 2 et 3. Il présente également des lignes de conduites adoptées dans le code de Django.</p>\n<section id=\"philosophy\">\n<h2>Philosophie<a class=\"heading-anchor\" href=\"#philosophy\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>This document assumes that you are familiar with the changes between Python 2\nand Python 3. If you aren’t, read <a class=\"reference external\" href=\"https://docs.python.org/3/howto/pyporting.html#pyporting-howto\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">Python’s official porting guide</span></a> first. Refreshing your knowledge of unicode handling on\nPython 2 and 3 will help; the <a class=\"reference external\" href=\"http://nedbatchelder.com/text/unipain.html\">Pragmatic Unicode</a> presentation is a good\nresource.</p>\n<p>Django a choisi la stratégie <em>source compatible Python 2 et 3</em>. Vous êtes évidemment libre de choisir une autre stratégie pour votre propre code, particulièrement si vous n’avez pas besoin de rester compatible avec Python 2. Mais les auteurs d’applications enfichables sont encouragés à adopter la même stratégie de transition que Django.</p>\n<p>L’écriture de code compatible est bien plus facile si vous ciblez Python ≥ 2.6. Django 1.5 introduit des outils de compatibilité tels que <a class=\"reference internal\" href=\"#module-django.utils.six\" title=\"django.utils.six\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.six</span></code></a>, qui est une version adaptée du module <code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">six</span></code>. Par commodité, des alias de compatibilité ascendante ont été introduits dans Django 1.4.2. Si votre application tire profit de ces outils, elle nécessitera au moins Django ≥ 1.4.2.</p>\n<p>De toute évidence, l’écriture de code source compatible ajoute une certaine charge qui peut parfois être frustrante. Les développeurs de Django ont constaté que d’écrire du code Python 3 en veillant à ce qu’il reste compatible avec Python 2 est plus gratifiant que l’inverse. Non seulement le code sera plus pérenne, mais les avantages de Python 3 (comme une gestion plus saine du texte) se révèlent assez rapidement. La contrainte de Python 2 devient une exigence de rétrocompatibilité et nous, développeurs, sommes habitués à faire face à de telles contraintes.</p>\n<p>Les outils de migration fournis par Django sont inspirés de cette approche et cela se reflète tout au long de ce guide.</p>\n</section>\n<section id=\"porting-tips\">\n<h2>Aides à la migration<a class=\"heading-anchor\" href=\"#porting-tips\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"unicode-literals\">\n<h3>Chaînes littérales unicode<a class=\"heading-anchor\" href=\"#unicode-literals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cette étape consiste à :</p>\n<ul class=\"simple\">\n<li><p>Ajouter <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">__future__</span> <span class=\"pre\">import</span> <span class=\"pre\">unicode_literals</span></code> au début de chaque module Python. Il est conseillé de le mettre vraiment dans tous les modules, sinon vous ne saurez jamais dans quel mode vous êtes sans chaque fois regarder au début du fichier concerné.</p></li>\n<li><p>Enlever les préfixes <code class=\"docutils literal notranslate\"><span class=\"pre\">u</span></code> devant toutes les chaînes unicode.</p></li>\n<li><p>Ajouter un préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">b</span></code> devant les chaînes d’octets.</p></li>\n</ul>\n<p>L’application systématique de ces modifications garantit la rétrocompatibilité.</p>\n<p>Cependant, les applications Django ne nécessitent généralement pas de chaînes d’octets, car Django n’expose que des interfaces unicode au programmeur. Python 3 décourage l’utilisation de chaînes d’octets, sauf pour les données binaires ou les interfaces orientées octets. Dans Python 2, les chaînes d’octets et les chaînes unicode sont pratiquement interchangeables tant qu’elles ne contiennent pas de données non ASCII. Profitez de ceci pour employer des chaînes unicode autant que possible en évitant les préfixes <code class=\"docutils literal notranslate\"><span class=\"pre\">b</span></code>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">u</span></code> de Python 2 est une erreur de syntaxe dans Python 3.2, mais il est de nouveau autorisé dans Python 3 suite à la <span class=\"target\" id=\"index-4\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0414/\"><strong>PEP 414</strong></a>. Ainsi, cette transformation est facultative si vous ciblez Python ≥ 3.3. Mais c’est toujours recommandé, selon la philosophie « écrivons du code Python 3 ».</p>\n</aside>\n</section>\n<section id=\"string-handling\">\n<h3>Gestion des chaînes<a class=\"heading-anchor\" href=\"#string-handling\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le type <a class=\"reference external\" href=\"https://docs.python.org/2/library/functions.html#unicode\">unicode</a> de Python 2 a été renommé <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">str</span></code></a> dans Python 3, <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> a été renommé <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#bytes\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">bytes</span></code></a> et <a class=\"reference external\" href=\"https://docs.python.org/2/library/functions.html#basestring\">basestring</a> a disparu. <a class=\"reference external\" href=\"https://pythonhosted.org/six/\">six</a> offre des <a class=\"reference internal\" href=\"#string-handling-with-six\"><span class=\"std std-ref\">outils</span></a> pour s’occuper de ces modifications.</p>\n<p>Django contient aussi plusieurs classes et fonctions liées aux chaînes dans les modules <a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#module-django.utils.encoding\" title=\"django.utils.encoding: A series of helper functions to manage character encoding.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.encoding</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#module-django.utils.safestring\" title=\"django.utils.safestring: Functions and classes for working with strings that can be displayed safely without further escaping in HTML.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.safestring</span></code></a>. Leurs noms contenait le mot <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>, qui n’a pas la même signification dans Python 2 et dans Python 3, et <code class=\"docutils literal notranslate\"><span class=\"pre\">unicode</span></code>, qui n’existe plus dans Python 3. Afin d’éviter des ambiguïtés et de la confusion, ces concepts ont été renommés <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">text</span></code>.</p>\n<p>Voici les changements de noms effectués dans <a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#module-django.utils.encoding\" title=\"django.utils.encoding: A series of helper functions to manage character encoding.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.encoding</span></code></a>:</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Ancien nom</p></th>\n<th class=\"head\"><p>Nouveau nom</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">smart_str</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">smart_bytes</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">smart_unicode</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">smart_text</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">force_unicode</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">force_text</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>Pour des motifs de rétrocompatibilité, les anciens noms fonctionnent encore avec Python 2. Avec Python 3, <code class=\"docutils literal notranslate\"><span class=\"pre\">smart_str</span></code> est un alias de <code class=\"docutils literal notranslate\"><span class=\"pre\">smart_text</span></code>.</p>\n<p>Pour des motifs de compatibilité ascendante, les nouveaux noms sont valables dès Django 1.4.2.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#module-django.utils.encoding\" title=\"django.utils.encoding: A series of helper functions to manage character encoding.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.encoding</span></code></a> a été réécrit en profondeur dans Django 1.5 pour fournir une API plus cohérente. Consultez sa documentation pour plus d’informations.</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#module-django.utils.safestring\" title=\"django.utils.safestring: Functions and classes for working with strings that can be displayed safely without further escaping in HTML.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.safestring</span></code></a> est principalement utilisée par les fonctions <a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#django.utils.safestring.mark_safe\" title=\"django.utils.safestring.mark_safe\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">mark_safe()</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#django.utils.safestring.mark_for_escaping\" title=\"django.utils.safestring.mark_for_escaping\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">mark_for_escaping()</span></code></a> qui n’ont elles-même pas changé. Dans le cas où vous utilisez ces structures internes, voici les modifications de noms effectuées :</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Ancien nom</p></th>\n<th class=\"head\"><p>Nouveau nom</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">EscapeString</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">EscapeBytes</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">EscapeUnicode</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">EscapeText</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SafeString</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SafeBytes</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SafeUnicode</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SafeText</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>Pour des motifs de rétrocompatibilité, les anciens noms fonctionnent encore avec Python 2. Avec Python 3, <code class=\"docutils literal notranslate\"><span class=\"pre\">EscapeString</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeString</span></code> sont respectivement des alias de <code class=\"docutils literal notranslate\"><span class=\"pre\">EscapeText</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeText</span></code>.</p>\n<p>Pour des motifs de compatibilité ascendante, les nouveaux noms sont valables dès Django 1.4.2.</p>\n</section>\n<section id=\"str-and-unicode-methods\">\n<h3>Méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__()</span></code><a class=\"heading-anchor\" href=\"#str-and-unicode-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dans Python 2, le modèle d’objet spécifie les méthodes <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> et <a class=\"reference external\" href=\"https://docs.python.org/2/reference/datamodel.html#object.__unicode__\">__unicode__()</a>. Si ces méthodes existent, elles doivent renvoyer respectivement <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> (octets) et <code class=\"docutils literal notranslate\"><span class=\"pre\">unicode</span></code> (texte).</p>\n<p>L’instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">print</span></code> et la fonction native <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">str</span></code></a> appellent <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> pour déterminer une représentation humainement lisible d’un objet. La fonction native <code class=\"docutils literal notranslate\"><span class=\"pre\">unicode</span></code> appelle <a class=\"reference external\" href=\"https://docs.python.org/2/reference/datamodel.html#object.__unicode__\">__unicode__()</a> si elle existe, et se rabat sinon sur <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> et décode le résultat avec le codage système. Inversement, la classe de base <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a>  déduit automatiquement <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> à partir de <a class=\"reference external\" href=\"https://docs.python.org/2/reference/datamodel.html#object.__unicode__\">__unicode__()</a> en codant le résultat en UTF-8.</p>\n<p>Avec Python 3, il n’existe que <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> qui doit renvoyer du contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> (texte).</p>\n<p>(Il est aussi possible de définir <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__bytes__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__bytes__()</span></code></a>, mais les applications Django n’ont que peu l’utilité de cette méthode, parce qu’elles ont rarement affaire directement à des octets (<code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code>).)</p>\n<p>Django propose une manière simple de définir les méthodes <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> et <a class=\"reference external\" href=\"https://docs.python.org/2/reference/datamodel.html#object.__unicode__\">__unicode__()</a> qui fonctionnent à la fois avec Python 2 et 3 : vous devez définir une méthode <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> renvoyant du texte et en lui appliquant le décorateur <a class=\"reference internal\" href=\"/fr/1.9/ref/utils/#django.utils.encoding.python_2_unicode_compatible\" title=\"django.utils.encoding.python_2_unicode_compatible\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">python_2_unicode_compatible()</span></code></a>.</p>\n<p>Avec Python 3, le décorateur effectue une opération blanche. Avec Python 2, il définit les méthodes <a class=\"reference external\" href=\"https://docs.python.org/2/reference/datamodel.html#object.__unicode__\">__unicode__()</a> et <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> appropriées (remplaçant la méthode <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__str__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a> originale dans le processus). Voici un exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">__future__</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">unicode_literals</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.encoding</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">python_2_unicode_compatible</span>\n\n<span class=\"nd\">@python_2_unicode_compatible</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyClass</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Instance of my class&quot;</span>\n</code></pre></div>\n<p>Cette technique est le meilleur exemple de la philosophie de migration adoptée par Django.</p>\n<p>Pour des motifs de compatibilité ascendante, ce décorateur est disponible dès Django 1.4.2.</p>\n<p>Finalement, notez que <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__repr__\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__repr__()</span></code></a> doit renvoyer du contenu de type <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> dans toutes les versions de Python.</p>\n</section>\n<section id=\"dict-and-dict-like-classes\">\n<h3>Classes <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a> et classes affiliées<a class=\"heading-anchor\" href=\"#dict-and-dict-like-classes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les méthodes de dictionnaire <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict.keys\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">dict.keys()</span></code></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict.items\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">dict.items()</span></code></a> et <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict.values\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">dict.values()</span></code></a> renvoient des listes en Python 2 et des itérateurs en Python 3. Les classes <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.QueryDict\" title=\"django.http.QueryDict\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QueryDict</span></code></a> et autres classes de type dictionnaire définies dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.datastructures</span></code> se comportent de la même manière en Python 3.</p>\n<p><a class=\"reference external\" href=\"https://pythonhosted.org/six/\">six</a> fournit des fonctions de compatibilité pour prendre en compte cette modification : <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">iterkeys()</span></code>, <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">iteritems()</span></code> et <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">itervalues()</span></code>. Il contient également une fonction non documentée <code class=\"docutils literal notranslate\"><span class=\"pre\">iterlists</span></code> qui fonctionne bien pour <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.datastructures.MultiValueDict</span></code> et ses sous-classes.</p>\n</section>\n<section id=\"httprequest-and-httpresponse-objects\">\n<h3>Objets <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a><a class=\"heading-anchor\" href=\"#httprequest-and-httpresponse-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Selon <span class=\"target\" id=\"index-5\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-3333/\"><strong>PEP 3333</strong></a>:</p>\n<ul class=\"simple\">\n<li><p>les en-têtes sont toujours des objets de type <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>,</p></li>\n<li><p>les flux d’entrée et de sortie sont toujours des objets de type <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code> (octets).</p></li>\n</ul>\n<p>Plus précisément, <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse.content\" title=\"django.http.HttpResponse.content\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">HttpResponse.content</span></code></a> contient des octets, ce qui peut poser problème quand on le compare avec un contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> dans les tests. La solution privilégiée est de compter sur <a class=\"reference internal\" href=\"/fr/1.9/topics/testing/tools/#django.test.SimpleTestCase.assertContains\" title=\"django.test.SimpleTestCase.assertContains\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertContains()</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.9/topics/testing/tools/#django.test.SimpleTestCase.assertNotContains\" title=\"django.test.SimpleTestCase.assertNotContains\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertNotContains()</span></code></a>. Ces méthodes acceptent une réponse et une chaîne unicode comme paramètres.</p>\n</section>\n</section>\n<section id=\"coding-guidelines\">\n<h2>Lignes directrices pour le code<a class=\"heading-anchor\" href=\"#coding-guidelines\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les lignes directrices suivantes ont été appliquées dans le code source de Django. Elles sont aussi recommandées pour les applications tierces qui suivent la même stratégie de migration.</p>\n<section id=\"syntax-requirements\">\n<h3>Contraintes de syntaxe<a class=\"heading-anchor\" href=\"#syntax-requirements\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"unicode\">\n<h4>Unicode<a class=\"heading-anchor\" href=\"#unicode\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>En Python 3, toutes les chaînes sont considérées par défaut comme de l’unicode. Le type <code class=\"docutils literal notranslate\"><span class=\"pre\">unicode</span></code> de Python 2 est appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> en Python 3 et l’ancien type <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> est devenu <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code>.</p>\n<p>Vous ne pouvez pas utiliser le préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">u</span></code> devant une chaîne littérale unicode parce que cela constitue une erreur de syntaxe en Python 3.2. Vous devez par contre préfixer les chaînes d’octets avec <code class=\"docutils literal notranslate\"><span class=\"pre\">b</span></code>.</p>\n<p>Afin d’activer un comportement identique en Python 2, chaque module doit importer <code class=\"docutils literal notranslate\"><span class=\"pre\">unicode_literals</span></code> provenant de <code class=\"docutils literal notranslate\"><span class=\"pre\">__future__</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">__future__</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">unicode_literals</span>\n\n<span class=\"n\">my_string</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is an unicode literal&quot;</span>\n<span class=\"n\">my_bytestring</span> <span class=\"o\">=</span> <span class=\"sa\">b</span><span class=\"s2\">&quot;This is a bytestring&quot;</span>\n</code></pre></div>\n<p>Si vous avez besoin d’une chaîne littérale d’octets en Python 2 et que cette même chaîne littérale soit de l’unicode en Python 3, utilisez la fonction native <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">str</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"s1\">&#39;my string&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>En Python 3, aucune conversion automatique n’est effectuée entre les types <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code>, et le module <a class=\"reference external\" href=\"https://docs.python.org/3/library/codecs.html#module-codecs\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">codecs</span></code></a> est devenu plus strict. <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.encode\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.encode()</span></code></a> renvoie toujours du contenu de type <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes.decode</span></code> du contenu de type <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>. Par conséquent, la structure suivante est parfois nécessaire :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">encode</span><span class=\"p\">(</span><span class=\"s1\">&#39;ascii&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ignore&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">(</span><span class=\"s1\">&#39;ascii&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Soyez prudent si vous devez <a class=\"reference external\" href=\"https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data\">indexer des chaînes d’octets</a>.</p>\n</section>\n<section id=\"exceptions\">\n<h4>Exceptions<a class=\"heading-anchor\" href=\"#exceptions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Lorsque vous interceptez des exceptions, utilisez le mot-clé <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n<span class=\"k\">except</span> <span class=\"n\">MyException</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Cette ancienne syntaxe a été supprimée en Python 3 :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n<span class=\"k\">except</span> <span class=\"n\">MyException</span><span class=\"p\">,</span> <span class=\"n\">exc</span><span class=\"p\">:</span>    <span class=\"c1\"># Don&#39;t do that!</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>La syntaxe pour repropager une exception avec une pile d’appel différente a aussi été modifiée. Utilisez <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">six.reraise()</span></code>.</p>\n</section>\n</section>\n<section id=\"magic-methods\">\n<h3>Méthodes magiques<a class=\"heading-anchor\" href=\"#magic-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Utilisez les modèles ci-dessous pour prendre en charge les méthodes magiques renommées en Python 3.</p>\n<section id=\"iterators\">\n<h4>Itérateurs<a class=\"heading-anchor\" href=\"#iterators\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyIterator</span><span class=\"p\">(</span><span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">Iterator</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__iter__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span>             <span class=\"c1\"># implement some logic here</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__next__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">StopIteration</span>     <span class=\"c1\"># implement some logic here</span>\n</code></pre></div>\n</section>\n<section id=\"boolean-evaluation\">\n<h4>Évaluation booléenne<a class=\"heading-anchor\" href=\"#boolean-evaluation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyBoolean</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__bool__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>             <span class=\"c1\"># implement some logic here</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">__nonzero__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>      <span class=\"c1\"># Python 2 compatibility</span>\n        <span class=\"k\">return</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__bool__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"division\">\n<h4>Division<a class=\"heading-anchor\" href=\"#division\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyDivisible</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__truediv__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span> <span class=\"o\">/</span> <span class=\"n\">other</span>     <span class=\"c1\"># implement some logic here</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">__div__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>   <span class=\"c1\"># Python 2 compatibility</span>\n        <span class=\"k\">return</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__truediv__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__itruediv__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span> <span class=\"o\">//</span> <span class=\"n\">other</span>    <span class=\"c1\"># implement some logic here</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">__idiv__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>  <span class=\"c1\"># Python 2 compatibility</span>\n        <span class=\"k\">return</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__itruediv__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ces méthodes spéciales sont recherchées au niveau de la classe, et non de l’instance, pour refléter le comportement de l’interpréteur Python.</p>\n</section>\n</section>\n<section id=\"writing-compatible-code-with-six\">\n<h3>Écriture de code compatible avec six<a class=\"heading-anchor\" href=\"#writing-compatible-code-with-six\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://pythonhosted.org/six/\">six</a> est la bibliothèque de compatibilité incontournable pour prendre en charge à la fois Python 2 et 3 dans une même base de code. Lisez sa documentation !</p>\n<p>Une <a class=\"reference internal\" href=\"#module-django.utils.six\" title=\"django.utils.six\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">version</span> <span class=\"pre\">adaptée</span> <span class=\"pre\">de</span> <span class=\"pre\">six</span></code></a> est incluse dans Django à partir de la version 1.4.2. Vous pouvez l’importer depuis <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.six</span></code>.</p>\n<p>Voici les modifications les plus fréquemment nécessaires pour écrire du code compatible.</p>\n<section id=\"string-handling-with-six\">\n<span id=\"id1\"></span><h4>Gestion des chaînes<a class=\"heading-anchor\" href=\"#string-handling-with-six\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les types <code class=\"docutils literal notranslate\"><span class=\"pre\">basestring</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">unicode</span></code> ont été supprimés en Python 3, et la signification de <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> a changé. Pour tester ces types, utilisez les idiomes suivants :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">myvalue</span><span class=\"p\">,</span> <span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">string_types</span><span class=\"p\">)</span>       <span class=\"c1\"># replacement for basestring</span>\n<span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">myvalue</span><span class=\"p\">,</span> <span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">text_type</span><span class=\"p\">)</span>          <span class=\"c1\"># replacement for unicode</span>\n<span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">myvalue</span><span class=\"p\">,</span> <span class=\"nb\">bytes</span><span class=\"p\">)</span>                  <span class=\"c1\"># replacement for str</span>\n</code></pre></div>\n<p>Python ≥ 2.6 dispose de l’alias <code class=\"docutils literal notranslate\"><span class=\"pre\">bytes</span></code> pour <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>, ce qui fait que vous n’avez pas besoin de <code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">six.binary_type</span></code>.</p>\n</section>\n<section id=\"long\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">long</span></code><a class=\"heading-anchor\" href=\"#long\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Le type <code class=\"docutils literal notranslate\"><span class=\"pre\">long</span></code> n’existe plus en Python 3. <code class=\"docutils literal notranslate\"><span class=\"pre\">1L</span></code> est une erreur de syntaxe. Utilisez le test <code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">six.integer_types</span></code> pour savoir si une valeur est un nombre entier ou un nombre entier long :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">myvalue</span><span class=\"p\">,</span> <span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">integer_types</span><span class=\"p\">)</span>      <span class=\"c1\"># replacement for (int, long)</span>\n</code></pre></div>\n</section>\n<section id=\"xrange\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">xrange</span></code><a class=\"heading-anchor\" href=\"#xrange\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si vous utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">xrange</span></code> avec Python 2, importez <code class=\"docutils literal notranslate\"><span class=\"pre\">six.moves.range</span></code> et utilisez plutôt cette fonction. Il est aussi possible d’importer <code class=\"docutils literal notranslate\"><span class=\"pre\">six.moves.xrange</span></code> (qui est équivalent à <code class=\"docutils literal notranslate\"><span class=\"pre\">six.moves.range</span></code>), mais la technique précédente permet de simplement supprimer l’importation au moment de laisser tomber la prise en charge de Python 2.</p>\n</section>\n<section id=\"moved-modules\">\n<h4>Modules déplacés<a class=\"heading-anchor\" href=\"#moved-modules\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Certains modules ont été renommés dans Python 3. Le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.six.moves</span></code> (basé sur le module <code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">six.moves</span></code>) constitue un emplacement d’importation compatible.</p>\n</section>\n<section id=\"py2\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">PY2</span></code><a class=\"heading-anchor\" href=\"#py2\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si vous avez besoin de différencier le code entre Python 2 et Python 3, testez <code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">six.PY2</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">PY2</span><span class=\"p\">:</span>\n    <span class=\"c1\"># compatibility code for Python 2</span>\n</code></pre></div>\n<p>Il s’agit d’une solution de dernier recours lorsque <code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">six</span></code> ne fournit pas de fonction correspondante.</p>\n</section>\n</section>\n<section id=\"django-customized-version-of-six\">\n<span id=\"module-django.utils.six\"></span><h3>La version adaptée de <code class=\"docutils literal notranslate\"><span class=\"pre\">six</span></code> dans Django<a class=\"heading-anchor\" href=\"#django-customized-version-of-six\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La version de <code class=\"docutils literal notranslate\"><span class=\"pre\">six</span></code> livrée avec Django (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.six</span></code>) contient quelques adaptations à usage purement interne.</p>\n</section>\n</section>","rootId":"porting-to-python-3","toc":[{"title":"Philosophie","anchor":"philosophy","children":[]},{"title":"Aides à la migration","anchor":"porting-tips","children":[{"title":"Chaînes littérales unicode","anchor":"unicode-literals","children":[]},{"title":"Gestion des chaînes","anchor":"string-handling","children":[]},{"title":"Méthodes __str__() et __unicode__()","anchor":"str-and-unicode-methods","children":[]},{"title":"Classes dict et classes affiliées","anchor":"dict-and-dict-like-classes","children":[]},{"title":"Objets HttpRequest et HttpResponse","anchor":"httprequest-and-httpresponse-objects","children":[]}]},{"title":"Lignes directrices pour le code","anchor":"coding-guidelines","children":[{"title":"Contraintes de syntaxe","anchor":"syntax-requirements","children":[{"title":"Unicode","anchor":"unicode","children":[]},{"title":"Exceptions","anchor":"exceptions","children":[]}]},{"title":"Méthodes magiques","anchor":"magic-methods","children":[{"title":"Itérateurs","anchor":"iterators","children":[]},{"title":"Évaluation booléenne","anchor":"boolean-evaluation","children":[]},{"title":"Division","anchor":"division","children":[]}]},{"title":"Écriture de code compatible avec six","anchor":"writing-compatible-code-with-six","children":[{"title":"Gestion des chaînes","anchor":"string-handling-with-six","children":[]},{"title":"long","anchor":"long","children":[]},{"title":"xrange","anchor":"xrange","children":[]},{"title":"Modules déplacés","anchor":"moved-modules","children":[]},{"title":"PY2","anchor":"py2","children":[]}]},{"title":"La version adaptée de six dans Django","anchor":"django-customized-version-of-six","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/1.9/topics/"}],"prev":{"docname":"topics/pagination","title":"Pagination","url":"/fr/1.9/topics/pagination/"},"next":{"docname":"topics/security","title":"La sécurité dans Django","url":"/fr/1.9/topics/security/"},"formats":{"html":"/fr/1.9/topics/python3/","markdown":"/fr/1.9/topics/python3.md","json":"/fr/1.9/topics/python3.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/topics/python3.txt","official":"https://docs.djangoproject.com/fr/1.9/topics/python3/","inVersions":["1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}