JAVA n'a plus de secret pour vous. Créer un projet, le passer de maven à graddle, enlever Spring, remplacer Guava par les API de Java 8 vous le faites sans même réfléchir. Vous avez essayé Python et la ce n'est plus la même affaire. Passé le "Hello World", quand il a fallu faire un projet de la vrai vie le courage vous a quitté. Cette conférence donnera les clefs pour bien débuter en Python quand on est un dev JAVA. Python 2 ou Python 3, choix d'un IDE, outils de build, contrôle de code, gestion des dépendances, choix des librairies, documentation, ressources indispensables à connaitre...
5. ● Langage généraliste
● Dynamiquement typé
● Orienté objet
● Fonctionnel
● Gestion de la mémoire par un garbage
collector
PYTHON
6. ● Créé par Guido van Rossum
● Version 0.9 datant de 1991
● Version 1.0 datant de 1994
● Développé par la communauté
● Code détenu par la Python Software
Fundation
● Evolution à travers des PEP (≈JSR)
PYTHON
8. ● Quelques changement de syntaxe
● Portée des variables limitées
● Fusion de librairies
● Utilisation de l’UTF-8 par défaut
● Exceptions
Python 2 ou Python 3
for ind in [1, 2, 3]:
squared = [ind**2 for ind in (20, 30, 40, 50)]
print(ind)
9. ● Contraint par l’environnement
● Contraint par des librairies
http://python3wos.appspot.com/ et
notamment Spark
● Vous voulez utiliser Jython
Pourquoi choisir Python 2
11. ● Bye bye les accolades !
● Ne pas mélanger espaces et tabulations
Identation
12. • En python3 toute les chaines sont unicodes
(comme java)
• Le préfixe r indique de ne pas échapper la
chaine
• Nombreuses fonctions disponibles
nativement
System.out.println()
c: empdir
c:tempdir
c:tempdir
print('c:tempdir')
print('c:tempdir')
print(r'c:tempdir')
13. ● List est un type natif
● Les tuples sont des listes immutables
● Les fonctions de manipulation sont intégrées
au langage
● Comme si Guava était inclus nativement
ArrayList
15. ArrayList
print(unTuple)
# Dernier élément
print(unTuple[-1])
# Entre le second et l'avant dernier élément
print(unTuple[1:-1])
# Un élément sur deux de la liste
print(unTuple[::2])
# En inversant l'ordre
print(unTuple[::-1])
(22, 29, 56, 35)
35
(29, 56)
(22, 56)
(35, 56, 29, 22)
16. ArrayList
# Equivalent du .equals() en Java
print(copie == uneListe)
# Equivalent du == en Java
print(copie is uneListe)
# Equivalent du hashCode() en java
print(id(copie), id(uneListe))
True
False
51316416 51315096
17. ArrayList
print("for ... in ...")
for dpt in uneListe:
print(dpt)
print("for ... in enumerate(...)")
for idx, dpt in enumerate(uneListe):
print(idx, " -> ", dpt)
for ... in ...
Morbihan
...
Loire-Atlantique
for ... in enumerate(...)
0 -> Morbihan
...
4 -> Loire-Atlantique
18. ArrayList
if 'Morbihan' in uneListe :
print("A moitié bretons")
uneListe.remove('Morbihan')
print(uneListe)
uneListe.sort()
print(uneListe)
A moitié bretons
['Finistère', 'Côtes-dArmor', 'Ile et
Vilaine', 'Loire-Atlantique']
['Côtes-dArmor', 'Finistère', 'Ile et
Vilaine', 'Loire-Atlantique']
19. Set
# Création de la patte à galette
myset = {'farine', 'eau', 'sel', 'oeufs'}
print(myset)
# Finalement double dose de farine
myset.add('farine')
print(myset)
# Jamais de la vie avec des oeufs
myset.remove('oeufs')
print(myset)
{'eau', 'sel', 'farine', 'oeufs'}
{'eau', 'sel', 'farine', 'oeufs'}
{'eau', 'sel', 'farine'}
20. Map
mydict = {
# Tableau comme valeur
'ingredients':
['farine', 'eau'],
# Set comme valeur
'ustensiles': {'spatule', 'poele'},
# Tout type
'duree': 10,
# Imbrication des dictionaires entre eux
'difficulte': {
'debutants': 'facile',
'experimente': 'super facile'}
}
print(mydict)
mydict.pop('ustensiles')
print(json.dumps(mydict, indent=2, separators=(',',
': ')))
24. Classes
class MaClasse(object):
def __init__(self, transform):
self.attribut = 'un attribut'
self.transform = transform
def affiche(self):
print(self.transform(self.attribut))
if __name__ == '__main__':
uneIntance = MaClasse(lambda x:x.upper())
uneIntance.affiche()
UN ATTRIBUT
25. ● Favoriser autant que possible l’utilisation de
fonctions
● Toujours préférer une fonction à l’utilisation
de l’héritage
Classes et fonctions
26. ● Notion de package comme en java
● Un répertoire doit contenir un fichier
__init__.py
● Possibilité d’importer un package dans son
intégralité ou bien seulement un module
● Le mot clé as permet de gérer les éventuels
conflits de nommage
● Recherche relativement à la variable
PYTHON_PATH
Import
32. Documentation
def max(*args, key=None):
"""
max(iterable, *[, default=obj, key=func]) -
> value
max(arg1, arg2, *args, *[, key=func]) ->
value
With a single iterable argument, return its
biggest item. The default keyword-only
argument specifies an object to return if
the provided iterable is empty. With two or
more arguments, return the largest
argument.
"""
pydoc permet de générer la doc
33. JUNIT, TestNG <> unittest
import unittest
def fun(x,y):
return x + y
class MyTest(unittest.TestCase):
def setUp(self):
self.inc = 1
def test_premier(self):
self.assertEqual(fun(3,self.inc), 4)
def test_second(self):
self.assertEqual(fun(3,self.inc), 'wrong')
34. Mockito <> unittest.mock
from unittest.mock import MagicMock
class ProductionClass(object):
def method(self):
self.something(1, 2, 3)
def something(self, a, b, c):
pass
real = ProductionClass()
real.something = MagicMock()
real.method()
real.something.assert_called_once_with(1, 2, 3)
Dans la librairie standard depuis
Python 3.3
35. ● Extrêmement complet
● Attention à ne bien initialiser qu’une fois
● Pas tout le temps compatible avec d’autre
modules (multithread windows par exemple)
xxx4J, LogPack <>Logging
import logging
logging.basicConfig(filename='example.log',level=l
ogging.DEBUG)
logging.debug('This message should go to the log
file')
logging.info('So should this')
logging.warning('And this, too')
39. ● Pip est le gestionnaire de dépendance
couramment utilisé
● Par convention la liste des dépendance est
contenue dans le fichier requirements.txt
● Pour installer / upgrader
Gestion des dépendances
pymongo==2.8.0
pymssql==2.1.1
pip install requirements.txt
40. Virtualenv
● VENV permet d’isoler un environnement
d’éxécution
● Permet de figer une version de Python et les
dépendances
● Absolument nécessaire en toute occasion
python -m venv myenv
myenv/Scripts/activate.bat
42. Jodatime <> dateutil
from dateutil.relativedelta import *
from dateutil.easter import *
from dateutil.rrule import *
from dateutil.parser import *
now = parse("Sat May 30 15:20:08 GMT 2015")
today = now.date()
year =
rrule(YEARLY,bymonth=8,bymonthday=13,byweekday=FR
)[0].year
rdelta = relativedelta(easter(year), today)
print(…)
Today is: 2015-05-30
Year with next Aug 13th on a Friday is: 2021
How far is the Easter of that year:
relativedelta(years=+5, months=+10, days=+5)
And the Easter of that year is: 2021-04-04
43. HTTPClient <> Requests
r = requests.get('https://…/json', auth=('u','p'))
print(r.status_code)
print(r.headers['content-type'])
os.system("pause")
print(r.text)
os.system("pause")
print(r.json()['releases']['1.0.4 '])
● Mises à jour de sécurité fréquentes
● Pool de connections
● Gestion multi-part
● Persistance de cookies
● …
44. Bootle <> Spring MVC
from bottle import get, post, request # or route
@get('/login') # or @route('/login')
def login():
return '''<form action="/login … '''
@post('/login') # or @route('/login', method='POST')
def do_login():
username = request.forms.get('username')
if check_login(username, password):
return "<p>Your login was correct.</p>"
else:
return "<p>Login failed.</p>"
● Template, routing, serialization …
45. ● SQLAlchemy est Spring JDBC et Hibernate
réunis
● DJANGO est à Python de que Grails est à
Groovy
● Des librairies scientifique pour grapher des
résultats
● Spark et son API PYTHON
● Des drivers pour toutes les bases de
données No-SQL
● …
Et aussi