[tutos] Ressources Utiles


kochka
 Share

Messages recommandés

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é par kochka
Lien vers le commentaire
Partager sur d'autres sites

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é par kochka
Lien vers le commentaire
Partager sur d'autres sites

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

  • 1 year later...

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Share