Work in progress … Work in progress … Work in progress … Work in progress …
Voici un code python :
a=1 print a
à l'exécution, vous obtenez l'erreur suivante :
File "test.py", line 1 a=1 ^ IndentationError: unexpected indent
en effet, il y a un espace avant a=1
. En python, l'identation fait partie de
la syntaxe. Si une commande est indentée, c'est qu'elle doit faire partie d'un
bloc d'exécution (après un if, un while ou un for). Ici, python ne trouve pas
le bloc auquel devrait appartenir l'instruction a=1
et renvoie une erreur.
Évitez d'appeler vos codes socket.py
, ldap.py
, etc. Sinon vous allez avoir des surprises avec la commande :
import socket import ldap
Si cela vous arrive, il faut changer de nom votre code et effacer le fichier socket.pyc
qui est apparu.
Que fait ce code ?
dico = { 'test':'toto' } liste = [dico] dico['test'] = 'titi' print liste
Contrairement à l'intuition, le résultat est :
[{'test': 'titi'}]
et pas :
[{'test': 'toto'}]
C'est parce que c'est l'objet dico qui est stocké dans la liste et pas sa valeur !
Pour retrouver un comportement plus proche de l'intuition, il faut utiliser la méthode copy :
dico = { 'test':'toto' } liste = [dico.copy()] dico['test'] = 'titi' print liste
Dans les exemples, faites bien attention : les constructeurs d'objets s'appellent __init__
avec deux underscores avant et après.
Idem pour le fichier d'initialisation de module : __init__.py
Comparez le résultat du code suivant en commentant et décommentant la ligne magique !
#!/usr/bin/python # -*- coding: utf-8 -*- """Se connecter à une base sqlite3 lire la base""" import sqlite3 db=sqlite3.connect('labintel.sqlite3') # Commande magique !!! db.row_factory=sqlite3.Row c=db.cursor() c.execute("SELECT * FROM pers") for line in c: # line se présente comme un tuple print line # mais en fait, il a des clés print line.keys() # et on peut accéder à la valeur de l'id sans connaître le numéro print line['id'] db.commit() db.close()
$Id: memopythonfaq.txt 660 2012-05-23 15:51:59Z aicardi $