1
0
Fork 0
python-docs-fr/howto/descriptor.po

1325 lines
47 KiB
Plaintext
Raw Normal View History

2018-07-04 09:06:45 +00:00
# Copyright (C) 2001-2018, Python Software Foundation
2018-07-04 09:08:42 +00:00
# For licence information, see README file.
2016-10-30 09:46:26 +00:00
#
msgid ""
msgstr ""
2019-12-05 22:15:54 +00:00
"Project-Id-Version: Python 3\n"
2016-10-30 09:46:26 +00:00
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-19 22:36+0200\n"
2020-12-18 06:09:57 +00:00
"PO-Revision-Date: 2020-12-17 21:41+0100\n"
"Last-Translator: Mathieu Dupuy <deronnax@gmail.com>\n"
2018-07-04 09:14:25 +00:00
"Language-Team: FRENCH <traductions@lists.afpy.org>\n"
2017-05-23 22:40:56 +00:00
"Language: fr\n"
2016-10-30 09:46:26 +00:00
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3\n"
2016-10-30 09:46:26 +00:00
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:5
2016-10-30 09:46:26 +00:00
msgid "Descriptor HowTo Guide"
msgstr "Guide pour l'utilisation des descripteurs"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:0
2017-12-01 06:48:13 +00:00
msgid "Author"
2018-01-21 22:53:31 +00:00
msgstr "Auteur"
2017-12-01 06:48:13 +00:00
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:7
2016-10-30 09:46:26 +00:00
msgid "Raymond Hettinger"
msgstr "Raymond Hettinger"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:0
2017-12-01 06:48:13 +00:00
msgid "Contact"
msgstr "Contact"
2016-10-30 09:46:26 +00:00
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:8
2017-12-01 06:48:13 +00:00
msgid "<python at rcn dot com>"
msgstr "<python at rcn dot com>"
2017-09-21 07:23:18 +00:00
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:11
2018-06-10 09:32:30 +00:00
msgid "Contents"
msgstr "Sommaire"
2018-06-10 09:32:30 +00:00
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:13
msgid ""
":term:`Descriptors <descriptor>` let objects customize attribute lookup, "
"storage, and deletion."
msgstr ""
#: howto/descriptor.rst:16
msgid "This guide has four major sections:"
msgstr ""
#: howto/descriptor.rst:18
msgid ""
"The \"primer\" gives a basic overview, moving gently from simple examples, "
"adding one feature at a time. Start here if you're new to descriptors."
msgstr ""
#: howto/descriptor.rst:21
msgid ""
"The second section shows a complete, practical descriptor example. If you "
"already know the basics, start there."
msgstr ""
#: howto/descriptor.rst:24
msgid ""
"The third section provides a more technical tutorial that goes into the "
"detailed mechanics of how descriptors work. Most people don't need this "
"level of detail."
msgstr ""
#: howto/descriptor.rst:28
msgid ""
"The last section has pure Python equivalents for built-in descriptors that "
"are written in C. Read this if you're curious about how functions turn into "
"bound methods or about the implementation of common tools like :func:"
"`classmethod`, :func:`staticmethod`, :func:`property`, and :term:`__slots__`."
msgstr ""
#: howto/descriptor.rst:36
msgid "Primer"
msgstr ""
#: howto/descriptor.rst:38
msgid ""
"In this primer, we start with the most basic possible example and then we'll "
"add new capabilities one by one."
msgstr ""
#: howto/descriptor.rst:43
msgid "Simple example: A descriptor that returns a constant"
msgstr ""
#: howto/descriptor.rst:45
msgid ""
"The :class:`Ten` class is a descriptor that always returns the constant "
"``10`` from its :meth:`__get__` method:"
msgstr ""
#: howto/descriptor.rst:54
msgid ""
"To use the descriptor, it must be stored as a class variable in another "
"class:"
msgstr ""
#: howto/descriptor.rst:62
msgid ""
"An interactive session shows the difference between normal attribute lookup "
"and descriptor lookup:"
msgstr ""
#: howto/descriptor.rst:73
msgid ""
"In the ``a.x`` attribute lookup, the dot operator finds the key ``x`` and "
"the value ``5`` in the class dictionary. In the ``a.y`` lookup, the dot "
"operator finds a descriptor instance, recognized by its ``__get__`` method, "
"and calls that method which returns ``10``."
msgstr ""
#: howto/descriptor.rst:78
msgid ""
"Note that the value ``10`` is not stored in either the class dictionary or "
"the instance dictionary. Instead, the value ``10`` is computed on demand."
msgstr ""
#: howto/descriptor.rst:81
msgid ""
"This example shows how a simple descriptor works, but it isn't very useful. "
"For retrieving constants, normal attribute lookup would be better."
msgstr ""
#: howto/descriptor.rst:84
msgid ""
"In the next section, we'll create something more useful, a dynamic lookup."
msgstr ""
#: howto/descriptor.rst:88
msgid "Dynamic lookups"
msgstr ""
#: howto/descriptor.rst:90
msgid ""
"Interesting descriptors typically run computations instead of returning "
"constants:"
msgstr ""
#: howto/descriptor.rst:109
msgid ""
"An interactive session shows that the lookup is dynamic — it computes "
"different, updated answers each time::"
msgstr ""
#: howto/descriptor.rst:122
msgid ""
"Besides showing how descriptors can run computations, this example also "
"reveals the purpose of the parameters to :meth:`__get__`. The *self* "
"parameter is *size*, an instance of *DirectorySize*. The *obj* parameter is "
"either *g* or *s*, an instance of *Directory*. It is the *obj* parameter "
"that lets the :meth:`__get__` method learn the target directory. The "
"*objtype* parameter is the class *Directory*."
msgstr ""
#: howto/descriptor.rst:131
msgid "Managed attributes"
msgstr ""
#: howto/descriptor.rst:133
msgid ""
"A popular use for descriptors is managing access to instance data. The "
"descriptor is assigned to a public attribute in the class dictionary while "
"the actual data is stored as a private attribute in the instance "
"dictionary. The descriptor's :meth:`__get__` and :meth:`__set__` methods "
"are triggered when the public attribute is accessed."
msgstr ""
#: howto/descriptor.rst:139
msgid ""
"In the following example, *age* is the public attribute and *_age* is the "
"private attribute. When the public attribute is accessed, the descriptor "
"logs the lookup or update:"
msgstr ""
#: howto/descriptor.rst:172
msgid ""
"An interactive session shows that all access to the managed attribute *age* "
"is logged, but that the regular attribute *name* is not logged:"
msgstr ""
#: howto/descriptor.rst:206
msgid ""
"One major issue with this example is that the private name *_age* is "
"hardwired in the *LoggedAgeAccess* class. That means that each instance can "
"only have one logged attribute and that its name is unchangeable. In the "
"next example, we'll fix that problem."
msgstr ""
#: howto/descriptor.rst:213
msgid "Customized names"
msgstr ""
#: howto/descriptor.rst:215
msgid ""
"When a class uses descriptors, it can inform each descriptor about which "
"variable name was used."
msgstr ""
#: howto/descriptor.rst:218
msgid ""
"In this example, the :class:`Person` class has two descriptor instances, "
"*name* and *age*. When the :class:`Person` class is defined, it makes a "
"callback to :meth:`__set_name__` in *LoggedAccess* so that the field names "
"can be recorded, giving each descriptor its own *public_name* and "
"*private_name*:"
msgstr ""
#: howto/descriptor.rst:256
msgid ""
"An interactive session shows that the :class:`Person` class has called :meth:"
"`__set_name__` so that the field names would be recorded. Here we call :"
"func:`vars` to look up the descriptor without triggering it:"
msgstr ""
#: howto/descriptor.rst:267
msgid "The new class now logs access to both *name* and *age*:"
msgstr ""
#: howto/descriptor.rst:284
msgid "The two *Person* instances contain only the private names:"
2020-12-18 06:09:57 +00:00
msgstr ""
#: howto/descriptor.rst:295
2020-12-18 06:09:57 +00:00
msgid "Closing thoughts"
msgstr ""
#: howto/descriptor.rst:297
2020-12-18 06:09:57 +00:00
msgid ""
"A :term:`descriptor` is what we call any object that defines :meth:"
"`__get__`, :meth:`__set__`, or :meth:`__delete__`."
msgstr ""
#: howto/descriptor.rst:300
2020-12-18 06:09:57 +00:00
msgid ""
"Optionally, descriptors can have a :meth:`__set_name__` method. This is "
"only used in cases where a descriptor needs to know either the class where "
"it was created or the name of class variable it was assigned to. (This "
"method, if present, is called even if the class is not a descriptor.)"
msgstr ""
#: howto/descriptor.rst:305
2020-12-18 06:09:57 +00:00
msgid ""
"Descriptors get invoked by the dot \"operator\" during attribute lookup. If "
"a descriptor is accessed indirectly with ``vars(some_class)"
"[descriptor_name]``, the descriptor instance is returned without invoking it."
msgstr ""
#: howto/descriptor.rst:309
2020-12-18 06:09:57 +00:00
msgid ""
"Descriptors only work when used as class variables. When put in instances, "
"they have no effect."
msgstr ""
#: howto/descriptor.rst:312
2020-12-18 06:09:57 +00:00
msgid ""
"The main motivation for descriptors is to provide a hook allowing objects "
"stored in class variables to control what happens during attribute lookup."
msgstr ""
#: howto/descriptor.rst:315
2020-12-18 06:09:57 +00:00
msgid ""
"Traditionally, the calling class controls what happens during lookup. "
"Descriptors invert that relationship and allow the data being looked-up to "
"have a say in the matter."
msgstr ""
#: howto/descriptor.rst:319
2020-12-18 06:09:57 +00:00
msgid ""
"Descriptors are used throughout the language. It is how functions turn into "
"bound methods. Common tools like :func:`classmethod`, :func:"
"`staticmethod`, :func:`property`, and :func:`functools.cached_property` are "
"all implemented as descriptors."
msgstr ""
#: howto/descriptor.rst:326
2020-12-18 06:09:57 +00:00
msgid "Complete Practical Example"
msgstr ""
#: howto/descriptor.rst:328
2020-12-18 06:09:57 +00:00
msgid ""
"In this example, we create a practical and powerful tool for locating "
"notoriously hard to find data corruption bugs."
msgstr ""
#: howto/descriptor.rst:333
2020-12-18 06:09:57 +00:00
msgid "Validator class"
msgstr ""
#: howto/descriptor.rst:335
2020-12-18 06:09:57 +00:00
msgid ""
"A validator is a descriptor for managed attribute access. Prior to storing "
"any data, it verifies that the new value meets various type and range "
"restrictions. If those restrictions aren't met, it raises an exception to "
"prevent data corruption at its source."
msgstr ""
#: howto/descriptor.rst:340
2020-12-18 06:09:57 +00:00
msgid ""
"This :class:`Validator` class is both an :term:`abstract base class` and a "
"managed attribute descriptor:"
msgstr ""
#: howto/descriptor.rst:363
2020-12-18 06:09:57 +00:00
msgid ""
"Custom validators need to inherit from :class:`Validator` and must supply a :"
"meth:`validate` method to test various restrictions as needed."
msgstr ""
#: howto/descriptor.rst:368
2020-12-18 06:09:57 +00:00
msgid "Custom validators"
msgstr ""
#: howto/descriptor.rst:370
2020-12-18 06:09:57 +00:00
msgid "Here are three practical data validation utilities:"
msgstr ""
#: howto/descriptor.rst:372
2020-12-18 06:09:57 +00:00
msgid ""
":class:`OneOf` verifies that a value is one of a restricted set of options."
msgstr ""
#: howto/descriptor.rst:374
2020-12-18 06:09:57 +00:00
msgid ""
":class:`Number` verifies that a value is either an :class:`int` or :class:"
"`float`. Optionally, it verifies that a value is between a given minimum or "
"maximum."
msgstr ""
#: howto/descriptor.rst:378
2020-12-18 06:09:57 +00:00
msgid ""
":class:`String` verifies that a value is a :class:`str`. Optionally, it "
"validates a given minimum or maximum length. It can validate a user-defined "
"`predicate <https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)>`_ "
"as well."
msgstr ""
#: howto/descriptor.rst:437
2020-12-18 06:09:57 +00:00
msgid "Practical application"
msgstr ""
#: howto/descriptor.rst:439
2020-12-18 06:09:57 +00:00
msgid "Here's how the data validators can be used in a real class:"
msgstr ""
#: howto/descriptor.rst:454
2020-12-18 06:09:57 +00:00
msgid "The descriptors prevent invalid instances from being created:"
msgstr ""
#: howto/descriptor.rst:481
2020-12-18 06:09:57 +00:00
msgid "Technical Tutorial"
msgstr ""
#: howto/descriptor.rst:483
2020-12-18 06:09:57 +00:00
msgid ""
"What follows is a more technical tutorial for the mechanics and details of "
"how descriptors work."
msgstr ""
#: howto/descriptor.rst:488
2016-10-30 09:46:26 +00:00
msgid "Abstract"
msgstr "Résumé"
#: howto/descriptor.rst:490
2016-10-30 09:46:26 +00:00
msgid ""
"Defines descriptors, summarizes the protocol, and shows how descriptors are "
2020-12-18 06:09:57 +00:00
"called. Provides an example showing how object relational mappings work."
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:493
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"Learning about descriptors not only provides access to a larger toolset, it "
2020-12-18 06:09:57 +00:00
"creates a deeper understanding of how Python works."
2016-10-30 09:46:26 +00:00
msgstr ""
"L'apprentissage des descripteurs permet non seulement d'accéder à un "
"ensemble d'outils plus vaste, mais aussi de mieux comprendre le "
"fonctionnement de Python et d'apprécier l'élégance de sa conception."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:498
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Definition and introduction"
msgstr "Définition et introduction"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:500
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"In general, a descriptor is an attribute value that has one of the methods "
"in the descriptor protocol. Those methods are :meth:`__get__`, :meth:"
"`__set__`, and :meth:`__delete__`. If any of those methods are defined for "
"an attribute, it is said to be a :term:`descriptor`."
2016-10-30 09:46:26 +00:00
msgstr ""
"En général, un descripteur est un attribut objet avec un \"comportement "
"contraignant\", dont l'accès à l'attribut a été remplacé par des méthodes "
"dans le protocole du descripteur. Ces méthodes sont : :meth:`__get__`, :"
"meth:`__set__`, et :meth:`__delete__`. Si l'une de ces méthodes est définie "
"pour un objet, il s'agit d'un descripteur."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:505
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"The default behavior for attribute access is to get, set, or delete the "
"attribute from an object's dictionary. For instance, ``a.x`` has a lookup "
"chain starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and "
2020-12-18 06:09:57 +00:00
"continuing through the method resolution order of ``type(a)``. If the looked-"
"up value is an object defining one of the descriptor methods, then Python "
"may override the default behavior and invoke the descriptor method instead. "
"Where this occurs in the precedence chain depends on which descriptor "
"methods were defined."
2016-10-30 09:46:26 +00:00
msgstr ""
"Le comportement par défaut pour l'accès aux attributs consiste à obtenir, "
"définir ou supprimer l'attribut du dictionnaire d'un objet. Par exemple, "
"``a. x`` a une chaîne de recherche commençant par ``a. __dict__ ['x']``, "
"puis ``type (a). __dict__ ['x']``, et continuant à travers les classes de "
"base de ``type (a)`` À l'exclusion des sous-classes. Si la valeur recherchée "
"est un objet définissant l'une des méthodes de descripteur, Python peut "
"substituer le comportement par défaut et appeler à la place la méthode "
"Descriptor. Lorsque cela se produit dans la chaîne de précédence dépend de "
"quelles méthodes descripteur ont été définies."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:514
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"Descriptors are a powerful, general purpose protocol. They are the "
"mechanism behind properties, methods, static methods, class methods, and :"
2020-12-18 06:09:57 +00:00
"func:`super()`. They are used throughout Python itself. Descriptors "
"simplify the underlying C code and offer a flexible set of new tools for "
"everyday Python programs."
2016-10-30 09:46:26 +00:00
msgstr ""
"Les descripteurs sont un protocole puissant et à usage général. Ils sont le "
"mécanisme derrière les propriétés, les méthodes, les méthodes statiques, les "
"méthodes de classes et :func:`super()`. Ils sont utilisés dans tout Python "
"lui-même pour implémenter les nouvelles classes de style introduites dans la "
"version 2.2. Les descripteurs simplifient le code C sous-jacent et offrent "
"un ensemble flexible de nouveaux outils pour les programmes Python "
"quotidiens."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:522
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Descriptor protocol"
msgstr "Protocole descripteur"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:524
2018-09-15 20:37:31 +00:00
msgid "``descr.__get__(self, obj, type=None) -> value``"
msgstr "``descr.__get__(self, obj, type=None) -> value``"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:526
2018-09-15 20:37:31 +00:00
msgid "``descr.__set__(self, obj, value) -> None``"
msgstr "``descr.__set__(self, obj, value) -> None``"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:528
2018-09-15 20:37:31 +00:00
msgid "``descr.__delete__(self, obj) -> None``"
msgstr "``descr.__delete__(self, obj) -> None``"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:530
2016-10-30 09:46:26 +00:00
msgid ""
"That is all there is to it. Define any of these methods and an object is "
"considered a descriptor and can override default behavior upon being looked "
"up as an attribute."
msgstr ""
"C'est tout ce qu'il y a à faire. Définissez n'importe laquelle de ces "
"méthodes et un objet est considéré comme un descripteur et peut remplacer le "
"comportement par défaut lorsqu'il est recherché comme un attribut."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:534
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2019-09-04 09:35:23 +00:00
"If an object defines :meth:`__set__` or :meth:`__delete__`, it is considered "
"a data descriptor. Descriptors that only define :meth:`__get__` are called "
2020-12-18 06:09:57 +00:00
"non-data descriptors (they are often used for methods but other uses are "
2019-09-04 09:35:23 +00:00
"possible)."
2016-10-30 09:46:26 +00:00
msgstr ""
2019-12-12 15:43:15 +00:00
"Si un objet définit :meth:`__set__` ou :meth:`__delete__`, il est considéré "
"comme un descripteur de données. Les descripteurs qui ne définissent que :"
"meth:`__get__` sont appelés descripteurs *non-data* (ils sont généralement "
"utilisés pour des méthodes mais d'autres utilisations sont possibles)."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:539
2016-10-30 09:46:26 +00:00
msgid ""
"Data and non-data descriptors differ in how overrides are calculated with "
"respect to entries in an instance's dictionary. If an instance's dictionary "
"has an entry with the same name as a data descriptor, the data descriptor "
"takes precedence. If an instance's dictionary has an entry with the same "
"name as a non-data descriptor, the dictionary entry takes precedence."
msgstr ""
"Les descripteurs de données et les descripteurs *non-data* diffèrent dans la "
"façon dont les dérogations sont calculées en ce qui concerne les entrées du "
"dictionnaire d'une instance. Si le dictionnaire d'une instance comporte une "
"entrée portant le même nom qu'un descripteur de données, le descripteur de "
"données est prioritaire. Si le dictionnaire d'une instance comporte une "
"entrée portant le même nom qu'un descripteur *non-data*, l'entrée du "
"dictionnaire a la priorité."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:545
2016-10-30 09:46:26 +00:00
msgid ""
"To make a read-only data descriptor, define both :meth:`__get__` and :meth:"
"`__set__` with the :meth:`__set__` raising an :exc:`AttributeError` when "
"called. Defining the :meth:`__set__` method with an exception raising "
"placeholder is enough to make it a data descriptor."
msgstr ""
"Pour faire un descripteur de données en lecture seule, définissez à la fois :"
"meth:`__get__` et :meth:`__set__` avec :meth:`__set__` levant une erreur :"
"exc:`AttributeError` quand il est appelé. Définir la méthode :meth:"
"`__set__set__` avec une exception élevant le caractère générique est "
"suffisant pour en faire un descripteur de données."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:552
2020-12-18 06:09:57 +00:00
msgid "Overview of descriptor invocation"
msgstr ""
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:554
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"A descriptor can be called directly with ``desc.__get__(obj)`` or ``desc."
"__get__(None, cls)``."
2016-10-30 09:46:26 +00:00
msgstr ""
"Un descripteur peut être appelé directement par son nom de méthode. Par "
"exemple, ``d.__get__(obj)``."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:557
2020-12-18 06:09:57 +00:00
msgid ""
"But it is more common for a descriptor to be invoked automatically from "
"attribute access."
msgstr ""
#: howto/descriptor.rst:560
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The expression ``obj.x`` looks up the attribute ``x`` in the chain of "
"namespaces for ``obj``. If the search finds a descriptor outside of the "
"instance ``__dict__``, its :meth:`__get__` method is invoked according to "
"the precedence rules listed below."
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:565
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The details of invocation depend on whether ``obj`` is an object, class, or "
"instance of super."
2016-10-30 09:46:26 +00:00
msgstr ""
"Les détails de l'invocation dépendent du fait que ``obj`` est un objet ou "
"une classe."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:570
2020-12-18 06:09:57 +00:00
msgid "Invocation from an instance"
msgstr ""
#: howto/descriptor.rst:572
2020-12-18 06:09:57 +00:00
msgid ""
"Instance lookup scans through a chain of namespaces giving data descriptors "
"the highest priority, followed by instance variables, then non-data "
"descriptors, then class variables, and lastly :meth:`__getattr__` if it is "
"provided."
msgstr ""
#: howto/descriptor.rst:577
2020-12-18 06:09:57 +00:00
msgid ""
"If a descriptor is found for ``a.x``, then it is invoked with: ``desc."
"__get__(a, type(a))``."
msgstr ""
#: howto/descriptor.rst:580
2020-12-18 06:09:57 +00:00
msgid ""
"The logic for a dotted lookup is in :meth:`object.__getattribute__`. Here "
"is a pure Python equivalent:"
msgstr ""
#: howto/descriptor.rst:700
2020-12-18 06:09:57 +00:00
msgid ""
"Interestingly, attribute lookup doesn't call :meth:`object.__getattribute__` "
"directly. Instead, both the dot operator and the :func:`getattr` function "
"perform attribute lookup by way of a helper function:"
msgstr ""
#: howto/descriptor.rst:747
2020-12-18 06:09:57 +00:00
msgid ""
"So if :meth:`__getattr__` exists, it is called whenever :meth:"
"`__getattribute__` raises :exc:`AttributeError` (either directly or in one "
"of the descriptor calls)."
msgstr ""
#: howto/descriptor.rst:750
2020-12-18 06:09:57 +00:00
msgid ""
"Also, if a user calls :meth:`object.__getattribute__` directly, the :meth:"
"`__getattr__` hook is bypassed entirely."
msgstr ""
#: howto/descriptor.rst:755
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Invocation from a class"
msgstr "Appelé depuis un Classe"
#: howto/descriptor.rst:757
2020-12-18 06:09:57 +00:00
msgid ""
"The logic for a dotted lookup such as ``A.x`` is in :meth:`type."
"__getattribute__`. The steps are similar to those for :meth:`object."
"__getattribute__` but the instance dictionary lookup is replaced by a search "
"through the class's :term:`method resolution order`."
msgstr ""
#: howto/descriptor.rst:762
2020-12-18 06:09:57 +00:00
msgid "If a descriptor is found, it is invoked with ``desc.__get__(None, A)``."
msgstr ""
#: howto/descriptor.rst:764
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The full C implementation can be found in :c:func:`type_getattro()` and :c:"
"func:`_PyType_Lookup()` in :source:`Objects/typeobject.c`."
msgstr ""
#: howto/descriptor.rst:769
2020-12-18 06:09:57 +00:00
msgid "Invocation from super"
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:771
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The logic for super's dotted lookup is in the :meth:`__getattribute__` "
"method for object returned by :class:`super()`."
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:774
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid ""
"A dotted lookup such as ``super(A, obj).m`` searches ``obj.__class__."
"__mro__`` for the base class ``B`` immediately following ``A`` and then "
"returns ``B.__dict__['m'].__get__(obj, A)``. If not a descriptor, ``m`` is "
"returned unchanged."
msgstr ""
"L'objet renvoyé par ``super()`` a également une méthode personnalisée :meth:"
"`__getattribute__` pour invoquer des descripteurs. La recherche d'attribut "
"``super(B, obj).m`` recherche dans ``obj.__class__.__mro__`` la classe qui "
"suit immédiatement B, appelons la A, et renvoie ``A.__dict__['m']."
"__get__(obj, B)``. Si ce n'est pas un descripteur, ``m`` est renvoyé "
"inchangé. S'il n'est pas dans le dictionnaire, la recherche de ``m`` revient "
"à une recherche utilisant :meth:`object.__getattribute__`."
#: howto/descriptor.rst:779
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid ""
"The full C implementation can be found in :c:func:`super_getattro()` in :"
"source:`Objects/typeobject.c`. A pure Python equivalent can be found in "
"`Guido's Tutorial <https://www.python.org/download/releases/2.2.3/descrintro/"
"#cooperation>`_."
msgstr ""
"Les détails d'implémentation sont dans :c:func:`super_getattro()` dans :"
"source:`Objects/typeobject.c` et un équivalent Python pur peut être trouvé "
"dans `Guido's Tutorial`_."
#: howto/descriptor.rst:786
2020-12-18 06:09:57 +00:00
msgid "Summary of invocation logic"
msgstr ""
#: howto/descriptor.rst:788
2020-12-18 06:09:57 +00:00
msgid ""
"The mechanism for descriptors is embedded in the :meth:`__getattribute__()` "
"methods for :class:`object`, :class:`type`, and :func:`super`."
msgstr ""
#: howto/descriptor.rst:791
2016-10-30 09:46:26 +00:00
msgid "The important points to remember are:"
msgstr "Les points importants à retenir sont :"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:793
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Descriptors are invoked by the :meth:`__getattribute__` method."
msgstr "les descripteurs sont appelés par la méthode :meth:`__getattribute__`"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:795
2020-12-18 06:09:57 +00:00
msgid ""
"Classes inherit this machinery from :class:`object`, :class:`type`, or :func:"
"`super`."
msgstr ""
#: howto/descriptor.rst:798
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid ""
"Overriding :meth:`__getattribute__` prevents automatic descriptor calls "
"because all the descriptor logic is in that method."
2016-10-30 09:46:26 +00:00
msgstr ""
"redéfinir :meth:`__getattribute____` empêche les appels automatiques de "
"descripteurs"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:801
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
":meth:`object.__getattribute__` and :meth:`type.__getattribute__` make "
2020-12-18 06:09:57 +00:00
"different calls to :meth:`__get__`. The first includes the instance and may "
"include the class. The second puts in ``None`` for the instance and always "
"includes the class."
2016-10-30 09:46:26 +00:00
msgstr ""
":meth:`objet.__getattribute__` et :meth:`type.__getattribute__` font "
"différents appels à :meth:`__get__`."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:806
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Data descriptors always override instance dictionaries."
2016-10-30 09:46:26 +00:00
msgstr ""
"les descripteurs de données remplacent toujours les dictionnaires "
"d'instances."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:808
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Non-data descriptors may be overridden by instance dictionaries."
2016-10-30 09:46:26 +00:00
msgstr ""
"les descripteurs *non-data* peuvent être remplacés par des dictionnaires "
"d'instance."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:812
2020-12-18 06:09:57 +00:00
msgid "Automatic name notification"
msgstr ""
#: howto/descriptor.rst:814
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"Sometimes it is desirable for a descriptor to know what class variable name "
"it was assigned to. When a new class is created, the :class:`type` "
"metaclass scans the dictionary of the new class. If any of the entries are "
"descriptors and if they define :meth:`__set_name__`, that method is called "
"with two arguments. The *owner* is the class where the descriptor is used, "
"and the *name* is the class variable the descriptor was assigned to."
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:821
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The implementation details are in :c:func:`type_new()` and :c:func:"
"`set_names()` in :source:`Objects/typeobject.c`."
2016-10-30 09:46:26 +00:00
msgstr ""
"Les détails d'implémentation sont dans :c:func:`super_getattro()` dans :"
"source:`Objects/typeobject.c` et un équivalent Python pur peut être trouvé "
"dans `Guido's Tutorial`_."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:824
2020-12-18 06:09:57 +00:00
msgid ""
"Since the update logic is in :meth:`type.__new__`, notifications only take "
"place at the time of class creation. If descriptors are added to the class "
"afterwards, :meth:`__set_name__` will need to be called manually."
msgstr ""
#: howto/descriptor.rst:830
2020-12-18 06:09:57 +00:00
msgid "ORM example"
msgstr ""
#: howto/descriptor.rst:832
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The following code is simplified skeleton showing how data descriptors could "
"be used to implement an `object relational mapping <https://en.wikipedia.org/"
"wiki/Object%E2%80%93relational_mapping>`_."
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:836
2020-12-18 06:09:57 +00:00
msgid ""
"The essential idea is that the data is stored in an external database. The "
"Python instances only hold keys to the database's tables. Descriptors take "
"care of lookups or updates:"
msgstr ""
#: howto/descriptor.rst:855
2020-12-18 06:09:57 +00:00
msgid ""
"We can use the :class:`Field` class to define `models <https://en.wikipedia."
"org/wiki/Database_model>`_ that describe the schema for each table in a "
"database:"
msgstr ""
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:880
2020-12-18 06:09:57 +00:00
msgid "To use the models, first connect to the database::"
msgstr ""
#: howto/descriptor.rst:885
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"An interactive session shows how data is retrieved from the database and how "
"it can be updated:"
2016-10-30 09:46:26 +00:00
msgstr ""
#: howto/descriptor.rst:930
2020-12-18 06:09:57 +00:00
msgid "Pure Python Equivalents"
msgstr ""
#: howto/descriptor.rst:932
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The descriptor protocol is simple and offers exciting possibilities. "
"Several use cases are so common that they have been prepackaged into built-"
"in tools. Properties, bound methods, static methods, class methods, and \\_"
"\\_slots\\_\\_ are all based on the descriptor protocol."
2016-10-30 09:46:26 +00:00
msgstr ""
"Le protocole est simple et offre des possibilités passionnantes. Plusieurs "
"cas d'utilisation sont si courants qu'ils ont été regroupés en appels de "
"fonction individuels. Les propriétés, les méthodes liées, les méthodes "
"statiques et les méthodes de classe sont toutes basées sur le protocole du "
"descripteur."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:939
2016-10-30 09:46:26 +00:00
msgid "Properties"
msgstr "Propriétés"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:941
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"Calling :func:`property` is a succinct way of building a data descriptor "
2020-12-18 06:09:57 +00:00
"that triggers a function call upon access to an attribute. Its signature "
"is::"
2016-10-30 09:46:26 +00:00
msgstr ""
"Appeler :func:`property` est une façon succincte de construire un "
"descripteur de données qui déclenche des appels de fonction lors de l'accès "
"à un attribut. Sa signature est ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:946
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"The documentation shows a typical use to define a managed attribute ``x``:"
2016-10-30 09:46:26 +00:00
msgstr ""
"La documentation montre une utilisation typique pour définir un attribut "
"géré ``x`` ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:970
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"To see how :func:`property` is implemented in terms of the descriptor "
2020-12-18 06:09:57 +00:00
"protocol, here is a pure Python equivalent:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Pour voir comment :func:`property` est implémenté dans le protocole du "
"descripteur, voici un un équivalent Python pur ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1063
2016-10-30 09:46:26 +00:00
msgid ""
"The :func:`property` builtin helps whenever a user interface has granted "
"attribute access and then subsequent changes require the intervention of a "
"method."
msgstr ""
"La fonction native :func:`property` aide chaque fois qu'une interface "
"utilisateur a accordé l'accès à un attribut et que des modifications "
"ultérieures nécessitent l'intervention d'une méthode."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1067
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"For instance, a spreadsheet class may grant access to a cell value through "
"``Cell('b10').value``. Subsequent improvements to the program require the "
"cell to be recalculated on every access; however, the programmer does not "
"want to affect existing client code accessing the attribute directly. The "
"solution is to wrap access to the value attribute in a property data "
2020-12-18 06:09:57 +00:00
"descriptor:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Par exemple, une classe de tableur peut donner accès à une valeur de cellule "
"via ``Cell('b10').value``. Les améliorations ultérieures du programme "
"exigent que la cellule soit recalculée à chaque accès ; cependant, le "
"programmeur ne veut pas affecter le code client existant accédant "
"directement à l'attribut. La solution consiste à envelopper l'accès à "
"l'attribut de valeur dans un descripteur de données de propriété ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1084
2020-12-18 06:09:57 +00:00
msgid ""
"Either the built-in :func:`property` or our :func:`Property` equivalent "
"would work in this example."
msgstr ""
#: howto/descriptor.rst:1089
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Functions and methods"
msgstr "Fonctions et méthodes"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1091
2016-10-30 09:46:26 +00:00
msgid ""
"Python's object oriented features are built upon a function based "
"environment. Using non-data descriptors, the two are merged seamlessly."
msgstr ""
"Les fonctionnalités orientées objet de Python sont construites sur un "
"environnement basé sur des fonctions. À l'aide de descripteurs *non-data*, "
"les deux sont fusionnés de façon transparente."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1094
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"Functions stored in class dictionaries get turned into methods when invoked. "
"Methods only differ from regular functions in that the object instance is "
"prepended to the other arguments. By convention, the instance is called "
"*self* but could be called *this* or any other variable name."
2016-10-30 09:46:26 +00:00
msgstr ""
"Les dictionnaires de classes stockent les méthodes sous forme de fonctions. "
2018-10-07 11:58:31 +00:00
"Dans une définition de classe, les méthodes sont écrites en utilisant :"
"keyword:`def` ou :keyword:`lambda`, les outils habituels pour créer des "
"fonctions. Les méthodes ne diffèrent des fonctions régulières que par le "
"fait que le premier argument est réservé à l'instance de l'objet. Par "
"convention Python, la référence de l'instance est appelée *self* mais peut "
"être appelée *this* ou tout autre nom de variable."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1099
2020-12-18 06:09:57 +00:00
msgid ""
"Methods can be created manually with :class:`types.MethodType` which is "
"roughly equivalent to:"
msgstr ""
#: howto/descriptor.rst:1116
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"To support automatic creation of methods, functions include the :meth:"
"`__get__` method for binding methods during attribute access. This means "
"that functions are non-data descriptors that return bound methods during "
"dotted lookup from an instance. Here's how it works:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Pour prendre en charge les appels de méthodes, les fonctions incluent la "
"méthode :meth:`__get__` pour lier les méthodes pendant l'accès aux "
"attributs. Cela signifie que toutes les fonctions sont des descripteurs "
"*non-data* qui renvoient des méthodes liées lorsqu'elles sont appelées "
"depuis un objet. En Python pur, il fonctionne comme ceci ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1132
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"Running the following class in the interpreter shows how the function "
"descriptor works in practice:"
2016-10-30 09:46:26 +00:00
msgstr ""
"L'exécution de l'interpréteur montre comment le descripteur de fonction se "
"comporte dans la pratique ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1141
2020-12-18 06:09:57 +00:00
msgid ""
"The function has a :term:`qualified name` attribute to support introspection:"
msgstr ""
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1148
2020-12-18 06:09:57 +00:00
msgid ""
"Accessing the function through the class dictionary does not invoke :meth:"
"`__get__`. Instead, it just returns the underlying function object::"
msgstr ""
#: howto/descriptor.rst:1154
2020-12-18 06:09:57 +00:00
msgid ""
"Dotted access from a class calls :meth:`__get__` which just returns the "
"underlying function unchanged::"
msgstr ""
#: howto/descriptor.rst:1160
2020-12-18 06:09:57 +00:00
msgid ""
"The interesting behavior occurs during dotted access from an instance. The "
"dotted lookup calls :meth:`__get__` which returns a bound method object::"
msgstr ""
#: howto/descriptor.rst:1167
2020-12-18 06:09:57 +00:00
msgid ""
"Internally, the bound method stores the underlying function and the bound "
"instance::"
msgstr ""
#: howto/descriptor.rst:1176
2020-12-18 06:09:57 +00:00
msgid ""
"If you have ever wondered where *self* comes from in regular methods or "
"where *cls* comes from in class methods, this is it!"
msgstr ""
#: howto/descriptor.rst:1181
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Kinds of methods"
msgstr "Fonctions et méthodes"
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:1183
2016-10-30 09:46:26 +00:00
msgid ""
"Non-data descriptors provide a simple mechanism for variations on the usual "
"patterns of binding functions into methods."
msgstr ""
"Les descripteurs *non-data* fournissent un mécanisme simple pour les "
"variations des patrons habituels des fonctions de liaison dans les méthodes."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1186
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"To recap, functions have a :meth:`__get__` method so that they can be "
"converted to a method when accessed as attributes. The non-data descriptor "
2020-12-18 06:09:57 +00:00
"transforms an ``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``cls."
2016-10-30 09:46:26 +00:00
"f(*args)`` becomes ``f(*args)``."
msgstr ""
"Pour résumer, les fonctions ont une méthode :meth:`__get__` pour qu'elles "
"puissent être converties en méthode lorsqu'on y accède comme attributs. Le "
"descripteur *non-data* transforme un appel ``obj.f(*args)``en ``f(obj, "
"*args)``. Appeler ``klass.f(*args)`` devient ``f(*args)``."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1191
2016-10-30 09:46:26 +00:00
msgid "This chart summarizes the binding and its two most useful variants:"
msgstr ""
"Ce tableau résume le lien (*binding*) et ses deux variantes les plus "
"utiles ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1194
2016-10-30 09:46:26 +00:00
msgid "Transformation"
msgstr "Transformation"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1194
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Called from an object"
msgstr "Appelé depuis un Objet"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1194
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Called from a class"
msgstr "Appelé depuis un Classe"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1197
2016-10-30 09:46:26 +00:00
msgid "function"
msgstr "fonction"
#: howto/descriptor.rst:1197
2016-10-30 09:46:26 +00:00
msgid "f(obj, \\*args)"
msgstr "f(obj, \\*args)"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1199
2016-10-30 09:46:26 +00:00
msgid "f(\\*args)"
msgstr "f(\\*args)"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1199
2016-10-30 09:46:26 +00:00
msgid "staticmethod"
msgstr "méthode statique"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1201
2016-10-30 09:46:26 +00:00
msgid "classmethod"
msgstr "méthode de classe"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1201
2016-10-30 09:46:26 +00:00
msgid "f(type(obj), \\*args)"
msgstr "f(type(obj), \\*args)"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1201
2020-12-18 06:09:57 +00:00
msgid "f(cls, \\*args)"
msgstr "f(cls, \\*args)"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1206
#, fuzzy
msgid "Static methods"
msgstr "méthode statique"
#: howto/descriptor.rst:1208
2016-10-30 09:46:26 +00:00
msgid ""
"Static methods return the underlying function without changes. Calling "
"either ``c.f`` or ``C.f`` is the equivalent of a direct lookup into ``object."
"__getattribute__(c, \"f\")`` or ``object.__getattribute__(C, \"f\")``. As a "
"result, the function becomes identically accessible from either an object or "
"a class."
msgstr ""
"Les méthodes statiques renvoient la fonction sous-jacente sans "
"modifications. Appeler ``c.f`` ou ``C.f`` est l'équivalent d'une recherche "
"directe dans ``objet.__getattribute__(c, \"f\")`` ou ``objet."
"__getattribute__(C, \"f\")``. Par conséquent, la fonction devient accessible "
"de manière identique à partir d'un objet ou d'une classe."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1214
2016-10-30 09:46:26 +00:00
msgid ""
"Good candidates for static methods are methods that do not reference the "
"``self`` variable."
msgstr ""
2018-10-06 15:37:06 +00:00
"Les bonnes candidates pour être méthode statique sont des méthodes qui ne "
"font pas référence à la variable ``self``."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1217
2016-10-30 09:46:26 +00:00
msgid ""
"For instance, a statistics package may include a container class for "
"experimental data. The class provides normal methods for computing the "
"average, mean, median, and other descriptive statistics that depend on the "
"data. However, there may be useful functions which are conceptually related "
"but do not depend on the data. For instance, ``erf(x)`` is handy conversion "
"routine that comes up in statistical work but does not directly depend on a "
"particular dataset. It can be called either from an object or the class: "
"``s.erf(1.5) --> .9332`` or ``Sample.erf(1.5) --> .9332``."
msgstr ""
2018-10-06 15:37:06 +00:00
"Par exemple, un paquet traitant de statistiques peut inclure une classe qui "
"est un conteneur pour des données expérimentales. La classe fournit les "
"méthodes normales pour calculer la moyenne, la moyenne, la médiane et "
"d'autres statistiques descriptives qui dépendent des données. Cependant, il "
"peut y avoir des fonctions utiles qui sont conceptuellement liées mais qui "
"ne dépendent pas des données. Par exemple, ``erf(x)`` est une routine de "
"conversion pratique qui apparaît dans le travail statistique mais qui ne "
"dépend pas directement d'un ensemble de données particulier. Elle peut être "
"appelée à partir d'un objet ou de la classe : ``s.erf(1.5) --> .9332``` ou "
"``Sample.erf(1.5) --> .9332``."
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1226
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"Since static methods return the underlying function with no changes, the "
"example calls are unexciting:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Depuis que les méthodes statiques renvoient la fonction sous-jacente sans "
"changement, les exemples dappels ne sont pas excitants ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1243
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"Using the non-data descriptor protocol, a pure Python version of :func:"
2020-12-18 06:09:57 +00:00
"`staticmethod` would look like this:"
2016-10-30 09:46:26 +00:00
msgstr ""
"En utilisant le protocole de descripteur *non-data*, une version Python pure "
"de :func:`staticmethod` ressemblerait à ceci ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1275
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Class methods"
msgstr "méthode de classe"
#: howto/descriptor.rst:1277
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"Unlike static methods, class methods prepend the class reference to the "
"argument list before calling the function. This format is the same for "
2020-12-18 06:09:57 +00:00
"whether the caller is an object or a class:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Contrairement aux méthodes statiques, les méthodes de classe préchargent la "
"référence de classe dans la liste d'arguments avant d'appeler la fonction. "
"Ce format est le même que l'appelant soit un objet ou une classe ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1295
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
2020-12-18 06:09:57 +00:00
"This behavior is useful whenever the method only needs to have a class "
"reference and does not rely on data stored in a specific instance. One use "
"for class methods is to create alternate class constructors. For example, "
"the classmethod :func:`dict.fromkeys` creates a new dictionary from a list "
"of keys. The pure Python equivalent is:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Ce comportement est utile lorsque la fonction n'a besoin que d'une référence "
2018-10-06 15:37:06 +00:00
"de classe et ne se soucie pas des données sous-jacentes. Une des "
"utilisations des méthodes de classe est de créer d'autres constructeurs de "
"classe. En Python 2.3, la méthode de classe :func:`dict.fromkeys` crée un "
"nouveau dictionnaire à partir d'une liste de clés. L'équivalent Python pur "
"est ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1312
2020-12-18 06:09:57 +00:00
#, fuzzy
msgid "Now a new dictionary of unique keys can be constructed like this:"
2016-10-30 09:46:26 +00:00
msgstr ""
"Maintenant un nouveau dictionnaire de clés uniques peut être construit comme "
"ceci ::"
2016-10-30 09:46:26 +00:00
#: howto/descriptor.rst:1322
2020-12-18 06:09:57 +00:00
#, fuzzy
2016-10-30 09:46:26 +00:00
msgid ""
"Using the non-data descriptor protocol, a pure Python version of :func:"
2020-12-18 06:09:57 +00:00
"`classmethod` would look like this:"
2016-10-30 09:46:26 +00:00
msgstr ""
"En utilisant le protocole de descripteur *non-data*, une version Python pure "
"de :func:`classmethod` ressemblerait à ceci ::"
2020-12-18 06:09:57 +00:00
#: howto/descriptor.rst:1371
2020-12-18 06:09:57 +00:00
msgid ""
"The code path for ``hasattr(type(self.f), '__get__')`` was added in Python "
"3.9 and makes it possible for :func:`classmethod` to support chained "
"decorators. For example, a classmethod and property could be chained "
"together:"
2020-12-18 06:09:57 +00:00
msgstr ""
#: howto/descriptor.rst:1391
2020-12-18 06:09:57 +00:00
msgid "Member objects and __slots__"
msgstr ""
#: howto/descriptor.rst:1393
2020-12-18 06:09:57 +00:00
msgid ""
"When a class defines ``__slots__``, it replaces instance dictionaries with a "
"fixed-length array of slot values. From a user point of view that has "
"several effects:"
msgstr ""
#: howto/descriptor.rst:1397
2020-12-18 06:09:57 +00:00
msgid ""
"1. Provides immediate detection of bugs due to misspelled attribute "
"assignments. Only attribute names specified in ``__slots__`` are allowed:"
msgstr ""
#: howto/descriptor.rst:1413
2020-12-18 06:09:57 +00:00
msgid ""
"2. Helps create immutable objects where descriptors manage access to private "
"attributes stored in ``__slots__``:"
msgstr ""
#: howto/descriptor.rst:1448
2020-12-18 06:09:57 +00:00
msgid ""
"3. Saves memory. On a 64-bit Linux build, an instance with two attributes "
"takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight "
"design pattern <https://en.wikipedia.org/wiki/Flyweight_pattern>`_ likely "
"only matters when a large number of instances are going to be created."
msgstr ""
#: howto/descriptor.rst:1453
2020-12-18 06:09:57 +00:00
msgid ""
"4. Blocks tools like :func:`functools.cached_property` which require an "
"instance dictionary to function correctly:"
msgstr ""
#: howto/descriptor.rst:1475
2020-12-18 06:09:57 +00:00
msgid ""
"It is not possible to create an exact drop-in pure Python version of "
"``__slots__`` because it requires direct access to C structures and control "
"over object memory allocation. However, we can build a mostly faithful "
"simulation where the actual C structure for slots is emulated by a private "
"``_slotvalues`` list. Reads and writes to that private structure are "
"managed by member descriptors:"
msgstr ""
#: howto/descriptor.rst:1518
2020-12-18 06:09:57 +00:00
msgid ""
"The :meth:`type.__new__` method takes care of adding member objects to class "
"variables:"
msgstr ""
#: howto/descriptor.rst:1534
2020-12-18 06:09:57 +00:00
msgid ""
"The :meth:`object.__new__` method takes care of creating instances that have "
"slots instead of an instance dictionary. Here is a rough simulation in pure "
"Python:"
msgstr ""
#: howto/descriptor.rst:1569
2020-12-18 06:09:57 +00:00
msgid ""
"To use the simulation in a real class, just inherit from :class:`Object` and "
"set the :term:`metaclass` to :class:`Type`:"
msgstr ""
#: howto/descriptor.rst:1583
2020-12-18 06:09:57 +00:00
msgid ""
"At this point, the metaclass has loaded member objects for *x* and *y*::"
msgstr ""
#: howto/descriptor.rst:1604
2020-12-18 06:09:57 +00:00
msgid ""
"When instances are created, they have a ``slot_values`` list where the "
"attributes are stored:"
msgstr ""
#: howto/descriptor.rst:1616
2020-12-18 06:09:57 +00:00
msgid "Misspelled or unassigned attributes will raise an exception:"
msgstr ""
#~ msgid ""
#~ "Defines descriptors, summarizes the protocol, and shows how descriptors "
#~ "are called. Examines a custom descriptor and several built-in Python "
#~ "descriptors including functions, properties, static methods, and class "
#~ "methods. Shows how each works by giving a pure Python equivalent and a "
#~ "sample application."
#~ msgstr ""
#~ "Définit les descripteurs, résume le protocole et montre comment les "
#~ "descripteurs sont appelés. Examine un descripteur personnalisé et "
#~ "plusieurs descripteurs Python intégrés, y compris les fonctions, les "
#~ "propriétés, les méthodes statiques et les méthodes de classe. Montre "
#~ "comment chacun fonctionne en donnant un équivalent Python pur et un "
#~ "exemple d'application."
#~ msgid "Invoking Descriptors"
#~ msgstr "Invocation des descripteurs"
#~ msgid ""
#~ "Alternatively, it is more common for a descriptor to be invoked "
#~ "automatically upon attribute access. For example, ``obj.d`` looks up "
#~ "``d`` in the dictionary of ``obj``. If ``d`` defines the method :meth:"
#~ "`__get__`, then ``d.__get__(obj)`` is invoked according to the precedence "
#~ "rules listed below."
#~ msgstr ""
#~ "Alternativement, il est plus courant qu'un descripteur soit invoqué "
#~ "automatiquement lors de l'accès aux attributs. Par exemple, ``obj.d`` "
#~ "recherche ``d`` dans le dictionnaire de ``obj.d``. Si ``d`` définit la "
#~ "méthode :meth:`__get__`, alors ``d.__get__(obj)`` est invoqué selon les "
#~ "règles de priorité énumérées ci-dessous."
#~ msgid ""
#~ "For objects, the machinery is in :meth:`object.__getattribute__` which "
#~ "transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. "
#~ "The implementation works through a precedence chain that gives data "
#~ "descriptors priority over instance variables, instance variables priority "
#~ "over non-data descriptors, and assigns lowest priority to :meth:"
#~ "`__getattr__` if provided. The full C implementation can be found in :c:"
#~ "func:`PyObject_GenericGetAttr()` in :source:`Objects/object.c`."
#~ msgstr ""
#~ "Pour les objets, la machinerie est dans :meth:`object.__getattribute__` "
#~ "qui transforme ``b.x`` en ``type(b).__dict__['x'].__get__(b, type(b)]``. "
#~ "L'implémentation fonctionne à travers une chaîne de priorité qui donne la "
#~ "priorité aux descripteurs de données sur les variables d'instance, la "
#~ "priorité aux variables d'instance sur les descripteurs *non-data*, et "
#~ "attribue la priorité la plus faible à :meth:`__getattr__` si fourni. "
#~ "L'implémentation complète en C peut être trouvée dans :c:func:"
#~ "`PyObject_GenericGetAttr()` dans :source:`Objects/object.c`."
#~ msgid ""
#~ "For classes, the machinery is in :meth:`type.__getattribute__` which "
#~ "transforms ``B.x`` into ``B.__dict__['x'].__get__(None, B)``. In pure "
#~ "Python, it looks like::"
#~ msgstr ""
#~ "Pour les classes, la machinerie est dans :meth:`type.__getattribute__` "
#~ "qui transforme ``B.x`` en ``B.__dict__['x'].__get__(None, B)``. En "
#~ "Python pur, cela ressemble à ::"
#~ msgid ""
#~ "The details above show that the mechanism for descriptors is embedded in "
#~ "the :meth:`__getattribute__()` methods for :class:`object`, :class:"
#~ "`type`, and :func:`super`. Classes inherit this machinery when they "
#~ "derive from :class:`object` or if they have a meta-class providing "
#~ "similar functionality. Likewise, classes can turn-off descriptor "
#~ "invocation by overriding :meth:`__getattribute__()`."
#~ msgstr ""
#~ "Les détails ci-dessus montrent que le mécanisme des descripteurs est "
#~ "intégré dans les méthodes :meth:`__getattribute__()` pour :class:"
#~ "`object`, :class:`type` et :func:`super`. Les classes héritent de cette "
#~ "machinerie lorsqu'elles dérivent de :class:`object` ou si elles ont une "
#~ "méta-classe fournissant des fonctionnalités similaires. De même, les "
#~ "classes peuvent désactiver l'appel de descripteurs en remplaçant :meth:"
#~ "`__getattribute__()`."
#~ msgid "Descriptor Example"
#~ msgstr "Exemple de descripteur"
#~ msgid ""
#~ "The following code creates a class whose objects are data descriptors "
#~ "which print a message for each get or set. Overriding :meth:"
#~ "`__getattribute__` is alternate approach that could do this for every "
#~ "attribute. However, this descriptor is useful for monitoring just a few "
#~ "chosen attributes::"
#~ msgstr ""
#~ "Le code suivant crée une classe dont les objets sont des descripteurs de "
#~ "données qui affichent un message pour chaque lecture ou écriture. "
#~ "Redéfinir :meth:`__getattribute__` est une approche alternative qui "
#~ "pourrait le faire pour chaque attribut. Cependant, ce descripteur n'est "
#~ "utile que pour le suivi de quelques attributs choisis ::"
#~ msgid "Static Methods and Class Methods"
#~ msgstr "Méthodes statiques et méthodes de classe"