Original Translation
27
A *namespace* is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries, but that's normally not noticeable in any way (except for performance), and it may change in the future. Examples of namespaces are: the set of built-in names (functions such as :func:`abs`, and built-in exception names); the global names in a module; and the local names in a function invocation. In a sense the set of attributes of an object also form a namespace. The important thing to know about namespaces is that there is absolutely no relation between names in different namespaces; for instance, two different modules may both define a function ``maximize`` without confusion --- users of the modules must prefix it with the module name.
Un *espace de nom* est une table de correspondance entre des noms et des objets. La plupart des espaces de noms sont actuellement implémentés sous forme de dictionnaires Python, mais ceci n'est normalement pas visible (sauf pour les performances) et peut changer dans le futur. Comme exemples d'espaces de noms, nous pouvons citer les primitives (fonctions comme :func:`abs`, et les noms des exceptions de base) ; les noms globaux dans un module ; et les noms locaux lors d'un appel de fonction. D'une certaine manière, l'ensemble des attributs d'un objet forme lui-même un espace de noms. La chose importante à retenir à propos des espaces de noms est qu'il n'y absolument aucun lien entre les noms de plusieurs espaces de noms ; par exemple, deux modules différents peuvent définir une fonction ``maximize`` sans qu'il y ait de confusion. Les utilisateurs des modules doivent préfixer le nom de la fonction avec celui du module.
28
By the way, I use the word *attribute* for any name following a dot --- for example, in the expression ``z.real``, ``real`` is an attribute of the object ``z``. Strictly speaking, references to names in modules are attribute references: in the expression ``modname.funcname``, ``modname`` is a module object and ``funcname`` is an attribute of it. In this case there happens to be a straightforward mapping between the module's attributes and the global names defined in the module: they share the same namespace! [#]_
À ce propos, nous utilisons le mot *attribut* pour tout nom suivant un point. Par exemple, dans l'expression ``z.real``, ``real`` est un attribut de l'objet ``z``. Rigoureusement parlant, les références à des noms dans des modules sont des références d'attributs : dans l'expression ``modname.funcname``, ``modname`` est un objet module et ``funcname`` est un attribut de cet objet. Dans ces conditions, il existe une correspondance directe entre les attributs du module et les noms globaux définis dans le module : ils partagent le même espace de noms ! [#]_
29
Attributes may be read-only or writable. In the latter case, assignment to attributes is possible. Module attributes are writable: you can write ``modname.the_answer = 42``. Writable attributes may also be deleted with the :keyword:`del` statement. For example, ``del modname.the_answer`` will remove the attribute :attr:`the_answer` from the object named by ``modname``.
Les attributs peuvent être seulement lisibles ou aussi modifiables. S'ils sont modifiables, l'affectation à un attribut est possible. Les attributs de modules sont modifiables : vous pouvez écrire ``modname.the_answer = 42``. Les attributs modifiables peuvent aussi être effacés avec l'instruction :keyword:`del`. Par exemple, ``del modname.the_answer`` supprime l'attribut :attr:`the_answer` de l'objet nommé ``modname``.
30
Namespaces are created at different moments and have different lifetimes. The namespace containing the built-in names is created when the Python interpreter starts up, and is never deleted. The global namespace for a module is created when the module definition is read in; normally, module namespaces also last until the interpreter quits. The statements executed by the top-level invocation of the interpreter, either read from a script file or interactively, are considered part of a module called :mod:`__main__`, so they have their own global namespace. (The built-in names actually also live in a module; this is called :mod:`builtins`.)
Les espaces de noms sont créés à différents moments et ont différentes durées de vie. L'espace de noms contenant les primitives est créé au démarrage de l'interprète Python et n'est jamais effacé. L'espace de nom global pour un module est créé lorsque la définition du module est lue. Habituellement, les espaces de noms des modules durent aussi jusqu'à l'arrêt de l'interprète. Les instructions exécutées par la première invocation de l'interprète, qu'ils soient lus depuis un fichier de script ou de manière interactive, sont considérés comme faisant partie d'un module appelé :mod:`__main__`, de façon qu'elles possèdent leur propre espace de noms. (les primitives vivent elles-mêmes dans un module, appelé :mod:`builtins`.)
31
The local namespace for a function is created when the function is called, and deleted when the function returns or raises an exception that is not handled within the function. (Actually, forgetting would be a better way to describe what actually happens.) Of course, recursive invocations each have their own local namespace.
32
A *scope* is a textual region of a Python program where a namespace is directly accessible. "Directly accessible" here means that an unqualified reference to a name attempts to find the name in the namespace.
Une *portée* est une zone textuelle d'un programme Python où un espace de noms est directement accessible. « Directement accessible » signifie ici qu'une référence non qualifée à un nom sera recherchée dans l'espace de nom.
33
Although scopes are determined statically, they are used dynamically. At any time during execution, there are at least three nested scopes whose namespaces are directly accessible:
Bien que les portées soient déterminées de manière statique, elles sont utilisées de manière dynamique. À n'importe quel moment de l'exécution, il y a au minimum trois portées imbriquées dont les espaces de noms sont directement accessibles :
34
the innermost scope, which is searched first, contains the local names
La portée la plus au centre, celle qui est consultée en premier, contient les noms locaux
35
the scopes of any enclosing functions, which are searched starting with the nearest enclosing scope, contains non-local, but also non-global names
les portées des fonctions englobantes, qui sont consultées en commençant avec la portée englobante la plus proche, contiennent des noms non-locaux mais aussi non-globaux
36
the next-to-last scope contains the current module's global names
l'avant dernière portée contient les noms globaux du module courant