kochka Posté(e) 6 mai 2006 Share Posté(e) 6 mai 2006 (modifié) Salut L'idée de ce topic est de regrouper des ressources ou des techniques utiles pour les scripts python Xbmc. Ce topic n'a pas pour but d'apprendre a programmer en Python mais de mettre en commun des routines ou experiences sur tous les aspects du dev Python pour Xbmc. Voilou ^_^ Mise en cache de données Si vous dévellopez un script multi-fenêtres et que ces fenêtres effectuent des parsing de données sur internet, le fait de les fermer et de les réouvrir relance des parsing inutiles sur internet. Cela ralenti donc la réactivité du script. L'idée est la de mettre en cache l'objet qui contient les données parsées pour les restitituer a chaque ouverture de fenêtre. On va donc mémoriser l'instance de l'objet dans un système de cache en y associant les arguments passés. Une classe statique oCache va se charger de ce travail. Deux methodes statiques : - oCache.add : Ajoute une instance au cache - oCache.remove : Enlève une instance du cache "oCache.add" renvoi l'instance de l'objet passé en paramètre comme une instanciation classique. Si l'objet est instancié avec les mêmes paramètres, alors il renvoi l'instance stockée en cache. class oCache: """ oCache static class: Objects instances caching based on args Author: kochka (kochka_'at'_gmail.com) """ instanceList = [] def new(oClass, *args, **kwargs): """ Create or retrieve from cache an instance of a class Params : class, args """ for cacheInstance in oCache.instanceList: if cacheInstance[0] == (oClass.__name__, args, kwargs): return cacheInstance[1] # Create a new instance instance = oClass(*args, **kwargs) oCache.instanceList.append([(oClass.__name__, args, kwargs), instance]) return instance new = staticmethod(new) def remove(className, *args, **kwargs): """ Remove an instance from cache Params : class name, args """ for key in range(len(oCache.instanceList)): if oCache.instanceList[key][0] == (className, args, kwargs): del oCache.instanceList[key] break else: raise KeyError, 'No instances corresponding to args' remove = staticmethod(remove) Exemple d'utilisation On imagine que vous avez une classe "dataList" qui parse et stock des données. Votre fennêtre instancie cette classe a chaque ouverture de celle ci. Avec oCache, ca donne : class maFenetre(xbmcgui.Window): def __init__(self, dataParam): xbmcgui.Window.__init__(self) # Creation d'une instance de données ou récupération du cache try: self.dataList = oCache.new(dataList, dataParam) except: print """ Erreur d'instanciation de la classe 'dataList' """ [...] Modifié 6 mai 2006 par kochka Lien vers le commentaire Partager sur d'autres sites More sharing options...
kochka Posté(e) 6 mai 2006 Auteur Share Posté(e) 6 mai 2006 (modifié) Eliminer les caractères html lors d'un parsing Quand vous parsez des données sur le net, elle sont normalement truffées de codes html pour les caractères speciaux comme par exemple & eacute, & qote, etc.. Pour les eliminer, vous pouvez utiliser les dictionnaires de la lib 'htmlentitydefs'. Nous allons donc utiliser le dictionnaire 'entitydefs' de cette lib qui pour un caractère html donne son equivalent iso-8859-1. Nous pouvons appliquer la transformation lors du parsing par expression régulière grace a 're.finditer' et une fonction lambda qui va appliquer la transformation via un 're.sub'. Ca sera plus clair dans l'exemple import urllib, refrom htmlentitydefs import entitydefsmonUrl = 'url de la page a parser'monResultat = []try: htmlContent = urllib.urlopen(monUrl).read() reParse = re.compile('Mon expression régulière de parsing') reClean = re.compile('&([A-Za-z]+?);') clean = lambda match: entitydefs[match.group(1)] for matchLine in reParse.finditer(htmlContent): monResultat.append(reClean.sub(clean, matchLine.group(1)))except IOError: print """ Impossible d'ouvrir la page %s """%colUrl raise Biensur 'matchLine.group(x)' depend du groupe a nettoyer dans l'expression régulière. Modifié 6 mai 2006 par kochka Lien vers le commentaire Partager sur d'autres sites More sharing options...
kochka Posté(e) 6 mai 2006 Auteur Share Posté(e) 6 mai 2006 Tester la connexion internet avant de lancer un script Votre script utilise la connexion internet, pour parser un site par exemple. Vous pouvez donc conditionner le lancement du script seulement si ce site est dispo. La fonction : def isHostUp(host): """ Test if a host is up """ import socket, time sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect((host, 80)) sock.close() del sock return True except socket.error, (errcode, errmsg): if errcode == 111: return True else: print 'Internet connection or host is down' return False En pratique : dialog = xbmcgui.DialogProgress()dialog.create('Test de connexion', 'Test de la résolution DNS', 'Veuillez patienter...')hostUp = isHostUp('mon url')dialog.close()if not hostUp: dialog = xbmcgui.Dialog() dialog.ok('Erreur', "La connexion internet n'est pas disponible")else: mainWin = mainWindow() mainWin.doModal() del mainWin Lien vers le commentaire Partager sur d'autres sites More sharing options...
alexsolex Posté(e) 28 octobre 2007 Share Posté(e) 28 octobre 2007 Bonjour Pour alléger le forum des sujets épinglés peu utile, ce sujet a été "libéré". Si vous jugiez qu'il a toute sa place parmis les sujets épinglés, merci de me le faire savoir. Lien vers le commentaire Partager sur d'autres sites More sharing options...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant