Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
Aide mémoire Python
-------------------
J Grelet June 2011 - March 2019
Les listes:
-----------
Collection d'objet
L=[]
L=[1,2,3,4]
L[2:]
[3,4]
L[:-1]
[1, 2, 3]
L[::-1]
[4, 3, 2, 1]
L.method() avec method = append, sort,index,reverse
Tuples:
-------
Un tuple est équivalent à une liste masi il n'est pas modifiable
T=(1,2,3)
T[1]
2
T[1]=5
TypeError: 'tuple' object does not support item assignment
Dictionnaires:
--------------
Tables non ordonnées de référence d'objets
D={}
D={'un': 1, "deux: 2}
D['un']
1
D.has_key('deux')
True
D.keys()
['un', 'deux']
D.values()
[1,2]
d[key] = value
Set d[key] to value.
del d[key]
Remove d[key] from d. Raises a KeyError if key is not in the map.
key in d
Return True if d has a key key, else False.
key not in d
Equivalent to not key in d.
iter(d)
Return an iterator over the keys of the dictionary. This is a shortcut for iter(d.keys()).
clear()
Remove all items from the dictionary.
copy()
Return a shallow copy of the dictionary.
classmethod fromkeys(seq[, value])
Create a new dictionary with keys from seq and values set to value.
fromkeys() is a class method that returns a new dictionary. value defaults to None.
get(key[, default])
Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None, so that this method never raises a KeyError.
items()
Return a new view of the dictionary’s items ((key, value) pairs). See the documentation of view objects.
keys()
Return a new view of the dictionary’s keys. See the documentation of view objects.
pop(key[, default])
If key is in the dictionary, remove it and return its value, else return default. If default is not given and key is not in the dictionary, a KeyError is raised.
popitem()
Remove and return an arbitrary (key, value) pair from the dictionary.
popitem() is useful to destructively iterate over a dictionary, as often used in set algorithms. If the dictionary is empty, calling popitem() raises a KeyError.
setdefault(key[, default])
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.
update([other])
Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.
update() accepts either another dictionary object or an iterable of key/value pairs (as tuples or other iterables of length two). If keyword arguments are specified, the dictionary is then updated with those key/value pairs: d.update(red=1, blue=2).
values()
Return a new view of the dictionary’s values. See the documentation of view objects.
Fonctions spéciales:
--------------------
lambda: fonction anonyme
f = lambda a, b: a + b
f(1,2)
3
apply: appelle des fonction avec des tuples en arguments
apply(f, (2,3)
5
map: applique une fonction à chaque objet d'une séquence
def m(x): return x*2
map(m,[0,2,4]
[0, 4, 8]
print: écrit sur la sortie standard
print "Class" + "Foo"
ClassFoo
print
print "Class %s is not = %d" % ('Foo', 1)
Class Foo is not = 1
print "Class %s is not = %d" % ('Foo', 1),
Classes et espace de nom (namespace):
-------------------------------------
import: récupère l'intégralité d'un module
from: récupère certains noms d'un module
reload: recharge le module modifié
Notion importante lorsque l'on travaille dans l'interpréteur (python ou ipython)
L'import charge et exécute la première fois le code du module (fichier)
> cat simple.py
print "Hello"
spam = 1
>>> import simple # importe charge et exécute la première fois le code du module
Hello
>>> simple.spam # l'affectation a créé un attribut
1
>>> simple.spam = 2 # change l'attribut dans le module
>>> import simple # récupère le module déjà chargé
>>> simple.spam # le code n'a pas été exécuté de nouveau
2
Classe Foo déclarée dans un module foo, soit un fichier foo.py
import foo
f=foo.Foo()
from foo import Foo
f = Foo()
Les fonctions définies dans les classes ne sont accéssibles que via une instance
a=Foo()
a.dummy()
Foo().dummy()
Avec python, un attribut d'instance (membre) est une simple variable et existe
dès qu'on lui affecte une valeur.
class Foo:
def foo(self,value):
self.attribut = value
return self.attribut
Foo().foo(5)
5
Cet attribut peux également être initialisé (par défault) à la création de
l'instance par le constructeur __init__ (méthode appelée à la création d'un
objet)
class Foo:
def __init__(self,value=0):
self.attribut = value
def __repr__(self):
return "%d" % self.attribut
a=Foo()
a
0
a=Foo(5)
a
5
Attribut de classe
class Foo:
foo = const
Attribut d'instance
class Foo:
__init__(self, value)
self.foo = value
En interne python associe les appels des méthodes d'instances aux méthodes de
classes:
instance.methode(args,...) => class.methode(instance, args, ...)
Attributs privés d'une classe (utilise le name mangling)
self.__attribut => self._Class.__atribut
Attribut protected est passé en protégé (accessible aux fils mais pas en
dehors de l'objet) simplement en ajoutant "_" (a verifier)
Méthodes de classes liées:
class Foo:
def foo(self, msg):
print msg
o = Foo()
f = o.foo
f('Hello')
Méthodes de classes non liées (unbound):
o = Foo()
<__main__.Foo instance at 0x927e70c>
f = Foo.foo
<unbound method Foo.foo>
f(o,'Hello')
Hello
Les méthodes non liées requièrent un objet explicite
Introspection:
--------------
Obtenir la liste des attribbuts d'une classe sous forme de dictionnaire:
o = Foo()
print o.__dict__
La liste des cles
print o.__dict__.keys()
La liste des valeurs
print o.__dict__.values()
Obtenir la liste des methodes et des attribbuts d'une classe:
print dir(o)
Determiner si les attributs d'un objet sont des methodes:
callable(o.<attribut>)
ex:
callable(o.name)
>>> True
type(o.name)
>>> <type 'instancemethod'>
Si une classe herite de object:
class foo(object):
print dir(o)
elle herite des methodes ['__class__','__setattr__', ....]
Liste des methodes:
methodList = [method for method in dir(object) if callable(getattr(object, method))]
Ajouter dynamiquement un attribut:
setattr(self, attributName, value)
Affecter dynamiquement un attribut (un dictionnaire ici):
setattr(self, attributName, {})
getattr(self, attributName)[key] = value
Remplir dynamiquement une l'equivalent C d'une structure en Python:
class bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
s = bunch() # initialisation
s = bunch(k1=v1, k2=v2, ....) # initialisation
s.k1 = v1
s.k2 = v2
avec l'exemple precedent:
setattr(self, s, {})
getattr(self, s)[k1] = v1
self.s[key].value
Ipyton:
-------
Pour changer de repertoire
cd path
Pour lancer un script
run script.py
Recharger un module:
import module ne charge le module que la premiere fois
faire un reload(module) apres modification du code
Installer ZCA (Zope Component Architecture)
-------------------------------------------
Depuis les sources:
zope.component-3.10.0.tar.gz
zope.component-3.4.0.tar.gz
zope.deferredimport-3.4.0.tar.gz
zope.deprecation-3.4.0.tar.gz
zope.event-3.4.1.tar.gz
zope.exceptions-3.4.0.tar.gz
zope.interface-3.4.0.tar.gz
zope.testing-3.5.6.tar.gz
> python setup.py build
> sudo python setup.py install
Interfaces:
-----------
from zope.interface import Interface, Attribute
class IFoo(Interface):
"""Foo interface documentation"""
x = Attribute("""Un attribut x""")
def bar(q, r=None):
"""bar methode: arg: q, r=none"""
IFoo.__doc__
'Foo interface documentation'
IFoo.__name__
'IFoo'
IFoo.__module__
'__main__'
Note that `bar` doesn't take a `self` argument. When calling instance methods,
you don't pass a `self` argument, so a `self` argument isn't included in the
interface signature.
names=list(IFoo)
names
['x', 'bar']
Declaring interfaces
====================
Having defined interfaces, we can *declare* that objects provide
them. Before we describe the details, lets define some terms:
*provide*
We say that objects *provide* interfaces. If an object provides an
interface, then the interface specifies the behavior of the
object. In other words, interfaces specify the behavior of the
objects that provide them.
*implement*
We normally say that classes *implement* interfaces. If a class
implements an interface, then the instances of the class provide
the interface. Objects provide interfaces that their classes
implement [#factory]_. (Objects can provide interfaces directly,
in addition to what their classes implement.)
It is important to note that classes don't usually provide the
interfaces that they implement.
We can generalize this to factories. For any callable object we
can declare that it produces objects that provide some interfaces
by saying that the factory implements the interfaces.
Now that we've defined these terms, we can talk about the API for
declaring interfaces.
Declaring implemented interfaces
--------------------------------
The most common way to declare interfaces is using the implements
function in a class statement::
from zope.interface import implements
class Foo:
implements(IFoo)
def __init__(self, x=None):
self.x = x
def bar(self, q, r=None):
return q, r, self.x
def __repr__(self):
return "Foo(%s)" % self.x
In this example, we declared that `Foo` implements `IFoo`. This means
that instances of `Foo` provide `IFoo`. Having made this declaration,
there are several ways we can introspect the declarations. First, we
can ask an interface whether it is implemented by a class::
>>> IFoo.implementedBy(Foo)
True
And we can ask whether an interface is provided by an object::
>>> foo = Foo()
>>> IFoo.providedBy(foo)
True
Configuration march 2019:
+++++++++++++++++++++++++
> pip3
Fatal error in launcher: Unable to create process using '"'
[ntird-us191-jg4:jgrelet]/c/git/python/pirata
> python3 -m pip install --upgrade pip
Successfully installed pip-19.0.3
[ntird-us191-jg4:jgrelet]/c/git/python/pirata
Sous Linux Ubuntu 16.04, l'upgrade de pip failed !
---------------------------------------------------
voir: https://askubuntu.com/questions/1025793/running-pip3-importerror-cannot-import-name-main
> pip install <package> --user
ou
> sudo pip install <package>
ou
Then I recommend adding the following aliases to your .bashrc:
pip() ( python -m pip "$@" )
pip3() ( python3 -m pip "$@" )
Commande pip pour lister les paquets installes, en root et mode user:
> pip list
> pip list --user
> pip show <package>
Il est prefereable d'installer la derniere version Python 3.7.2
Configuration du fichier VSC setting.json de jgrelet:
-----------------------------------------------------
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
// Placez vos paramètres dans ce fichier pour remplacer les paramètres par défaut
{
"go.gopath": "C:/Users/jgrelet/go",
"go.goroot": "c:/go",
"git.path": "C:\\Program Files\\Git\\bin",
//"terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\cmd.exe",
//"terminal.integrated.shellArgs.windows": ["/K", "C:\\opt\\cmder\\vscode.bat"],
//"terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shell.windows": "C:\\MinGW\\msys\\1.0\\bin\\bash.exe",
//"terminal.integrated.shellArgs.windows": ["--login", "-i"],
// "terminal.integrated.cwd": "/c/Users/jgrelet/go/src/bitbucket.org/jgrelet/raspberry/go/go-serial",
//"terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\cmd.exe",
//"terminal.integrated.shellArgs.windows": ["/k", "C:\\opt\\TDM-GCC-64\\mingwvars.bat"],
"matlab.mlintpath": "C:\\Program Files\\MATLAB\\R2016b\\bin\\win64\\mlint.exe",
"files.associations": {
"*.m": "matlab"
},
// "vim.enableNeovim": false,
//"http.proxy": "http://antea:3128"
"workbench.colorTheme": "Visual Studio Dark",
"go.liveErrors": {
"enabled": true,
"delay": 500
},
"git.autofetch": true,
"git.enableSmartCommit": true,
"explorer.confirmDelete": false,
"team.showWelcomeMessage": false,
//"files.autoSave": "afterDelay"
}
Pour utiliser le bash de git, modifier la ligne:
"terminal.integrated.shell.windows": "C:\\MinGW\\msys\\1.0\\bin\\bash.exe",
par
"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
Add in user setting.json:
"[python]": {
"editor.insertSpaces": true,
"editor.tabSize": 4
}
In setting.json:
"python.linting.pylintEnabled": true,
"python.linting.enabled": true,
"python.linting.mypyEnabled": false,
"python.pythonPath": "C:\\opt\\python\\python3.7\\python.exe",
"editor.formatOnSave": true,
"editor.formatOnType": true,
"python.autoComplete.addBrackets": true,
"editor.formatOnPaste": true
> pip install autopep8
Installer l'extension Python-autopep8
Cmd+P choisir autopip
> pip install pylint
Developpement:
> pip install pynmea2
> pip install pySerial
> pip install netCDF4
> pip install seawater
> pip install numpy
> pip install PyInstaller
> pip install PySimpleGUI
Pour utiliser QT au lieu de Tk
> pip install PySimpleGUIQt
> pip install PySide2
Puis remplacer le :
import PySimpleGUI as gs
par
import PySimpleGUIQt as gs
Sous Ubuntu, installer python3-tk pour PySimpleGUI:
> sudo apt-get install python3-tk
To create your EXE file from your program that uses PySimpleGUI, my_program.py,
enter this command in your Windows command prompt:
> pyinstaller -wF my_program.py
Tests avec unittest:
--------------------
Voir: https://docs.python.org/3.7/library/unittest.html?highlight=unittest
Run test in single file
> python - m unittest - v tests/test_roscop.py
Run all test_ * in dir tests:
> python - m unittest discover tests - v
> python - m unittest discover - s tests - p 'test_*.py' - v
Methods name:
assertEqual()
assertNotEqual()
assertTrue()
assertFalse()
assertRaises()
assertAlmostEqual()
assertNotAlmostEqual()
assertRegex()
assertNotRegex()
assertRaisesRegex()