Spécificité du langage¶
PEP 8¶
La PEP 8 définit tout un ensemble de rêgles non-contraignantes de codages, notamment les conventions de nommages et est un guide de mise en forme.
Les commandes pep8
et flake8
permettent de vérifier si la mise en
forme du code source est conforme à cette PEP, et sont installables via
pip.
On peut également installe pep8-naming qui va permettre de mettre le code en conformité vis à vis des conventions de nommage.
Une méthode ou variable préfixée d’un underscore _
n’a, par convention,
pas vocation à être utilisée à l’extérieur de la classe. Cependant, comme il
n’y a pas de notion de visibilité d’attributs et de méthodes, on n’empèche
personne de le faire.
De même, les méthodes encadrées par des double-underscore (par exemple
__init__
) sont des méthodes spéciales.
Selon la PEP 8:
Type |
Règles |
Exemples |
---|---|---|
Modules |
minuscule |
|
Classes |
Majuscule À Chaque Mot |
|
Exceptions |
*Error |
|
Fonctions et Méthodes |
minuscules_et_underscore |
|
Constantes |
MAJUSCULES |
|
Variables d’instances |
minuscules_et_underscore |
|
sys.path¶
La liste sys.path
a pour rôle de définir, pour python, les
emplacements où il doit chercher les librairies à charger.
Bien que déconseillé, il est possible de modifier sys.path
pour
permettre de charger dynamiquement des librairies.
Par défaut, celle-ci prend, dans l’ordre, les valeurs suivantes:
le dossier contenant le script lancé
les emplacements de la variable d’environnement
PYTHONPATH
l’emplacement de la stdlib
le site-packages
Mémoire¶
En python les variables n’ont pas le même fonctionnement qu’en C. Toutes sont des pointeurs vers des emplacements mémoires.
Le mot clé is
permet une comparaison des emplacements mémoires. Il
ne faut pas le confondre avec ==
qui lui compare les valeurs.
Le mot-clé is
fait en fait appel à la fonction id()
, qui
retourne l’emplacement mémoire pointé par la variable:
>>> a = 25614
>>> b = 25614
>>> a == b
True
>>> a is b
False
>>> id(a)
32271488
>>> id(b)
32271296
>>> b = a
>>> a is b
True
Warning
Les nombres de 0 à 255 et les caractères ASCII sont mises en mémoire par l’intérpréteur python avant le démarage de toute application. Ainsi, deux variables ayant la même valeur, contenue dans ces domaines, pointerons vers le même emplacement mémoire.
De même None
n’a qu’un emplacement mémoire.
>>> a = 192
>>> b = 192
>>> a is b
True
Un peu plus d’infos sur cette présentation au PyCon 2015.
Conditions¶
En python tout est vrai, sauf 0
, False
, None
et tous les conteneurs
vides (""
, ()
, []
, {}
, etc.).
On peut obtenir le même comportement sur un objet en utilisant les méthodes
__nonzero__()
ou
__len__()
(si
__nonzero__()
n’est pas défini).
En python3 __nonzero__()
est remplacé par
__bool__()
Muable/Immuable¶
Les objets pythons sont soit muable, soit immuable (mutable/immutable en anglais).
Un objet immuable n’accèpte pas de modification in-place, mais créera un
nouvel emplacement mémoire si on tente de le modifier. C’est le cas des types
simples comme les tuple
, str
, int
,
float
, etc.:
>>> a = 658942
>>> id(a)
32271488
>>> a += 614
>>> id(a)
33800192
Un objet muable garde son emplacement mémoire lorsqu’il est modifié. C’est
le cas notemment des séquences (list
, dict
, set
,
etc., sauf tuple
et frozenset
):
>>> a = [1, 2, 3, 4]
>>> id(a)
38120480
>>> a.append(5)
>>> id(a)
38120480
C’est aussi le cas des objets créés par le développeur.
On peut reproduire l’immutabilité sur des objets en utilisant object.__slots__
.
class Immutable(object):
"""An immutable class
"""
__slots__ = ["one", "two", "three"]
def __init__(self, one, two, three):
"""Constructor"""
super(Immutable, self).__setattr__("one", one)
super(Immutable, self).__setattr__("two", two)
super(Immutable, self).__setattr__("three", three)
def __setattr__(self, name, value):
msg = "'{0}' has no attribute {1}".format(self.__class__, name)
raise AttributeError(msg)