Un modèle d'objet que j'utilise depuis longtemps pour du prototypage :
class Character:
index = 1 # Index de classe (compte les instances, cf plus bas)
def __init__(self, name, **kargs): # Tous les mot-clés key=value seront intégrés
self.name = str(name.upper()) # On force le format du nom
for k,v in kargs.items(): # Pour tous les couples k=v passés en arguments
self.__dict__.update({k:v}) # On intègre le champ dans la définition de l'instance
self.index = Character.index # On affect l'indexe de classe en cours
Character.index += 1 # On incrémente l'indexe de classe
def __str__(self):
return json.dumps( self.__dict__, indent=2 )
C'est tout bête comme objet mais ça me sert toujours autant :).
Typiquement :
hero = Character("Toto", life=100, speed=20, force=4, observation=10)
print( hero )
{
"name": "TOTO",
"life": 100,
"speed": 20,
"force": 4,
"observation": 10,
"index": 1
}
via bearstech
Ah c'est ouf, l'option anchors fonctionne po... pasque bien pratique le système. Du coup on recadre un texte à la main :
from PIL import Image, ImageDraw
W, H = (300,200)
msg = "hello"
im = Image.new("RGBA",(W,H),"yellow")
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg) # évaluer la taille
draw.text(((W-w)/2,(H-h)/2), msg, fill="black") # recentrer
im.save("hello.png", "PNG")
Rigolo, une enième façon d'écrire la multiplication des éléments d'une liste:
>>> p = lambda x: 1 if len(x)==0 else x.pop()*p(x)
Et j'en vois arriver : han du coup tu consommes obligatoirement la cible :
>>> x = [1,2,3]
>>> p(x)
6
>>> x
[]
Pas forcément :
>>> x = [1,2,3]
>>> p(x[:])
6
>>> x
[1,2,3]
Merci le slicing ;-).
Oh bien vu, ça me dit rien. Le coup de fourrer une valeur par défaut je ne l'utilise que pour des valeurs "scalaires" du coup pas de souci :
>>> alist = [0]*3
>>> alist[1] = "POOP"
>>> alist
[0, 'POOP', 0]
>>> alist = [ "test" ]*3
>>> alist[1] = "POOP"
>>> alist
['test', 'POOP', 'test']
Cool
Une appli pour se faire une base de flims et séries (Imdb/Omdb), un peu les jeux, etc..
Backend endpoints:
https://dukeart.netlib.re/api/movies
https://dukeart.netlib.re/api/movies/id
https://dukeart.netlib.re/api/movies/id/tt0213338
Frontend views:
https://dukeart.netlib.re/api/movies/home
https://dukeart.netlib.re/api/movies/view
https://dukeart.netlib.re/api/movies/view/id/tt0213338
Je le remets à jour car il fonctionnait sur 2 serveurs et la je mix les 2 (Flask permet quand même de rester un peu propre en séparant les routes de l'application serveur et celles de nos interfaces API, bien que swagger ne documente pas par défaut les routes de l'appli).
Je remettrai un endpoint pour requêter sur l'API Omdb directement et je mettrai la source à dispo (on peut le réutiliser pour implémenter une autre interface, comics, livres, etc..).
Si pas déjà installé :
$ sudo pip3 install httpx[http2] dnspython
Un prototype pour une interface de requête HTTP en commande.
Sortie en JSON et possibilité de parser HTML/RSS.
Sûrement pas aussi robuste que http mais pour ce que j'ai testé, ça me va.
propre!
hmm sympa :D
Ooooh :/
#1 : Misusing expressions as defaults for function arguments
- En utilisant des dictionnaires ça passe non ?
#2 : Using class variables incorrectly
Ah les joies de la prog OO.
#3 : Specifying parameters incorrectly for an exception block
Bah j'utilise peu de try/except et je gère les exceptions à la main... #notaprogrammer
#4 : Misunderstanding Python scope rules
Nooooobs ^^
#5 : Modifying a list while iterating over it
Typique...
:)