Question

Si une propriété précompilée est une propriété calculée et mise en cache lors du premier accès ;J'aimerais faire la même chose, mais plutôt prendre plusieurs listes et les compiler en une seule liste principale.

Pour un peu de contexte, je suis actuellement en train de créer un site GAE/python/webapp2/jinja2.En épargnant les détails, ma liste d’itinéraires s’agrandit assez.Actuellement, j'ai des routes statiques, des routes dynamiques et des redirections, toutes regroupées dans une seule liste.

Exemple:

master = [
  Route('/',StaticHandler, defaults={'_uri':'index.html'}),
  Route('/about-us', StaticHandler, defaults={'_uri':'index.html'})
  Route('/secure/', AuthHandler, defaults={'_uri':'secure.html'}),
  Route('/secure/<_uri>', AuthHandler, defaults={'_uri':'not-found.html'})
  Route('/about.html', RedirectHandler, defaults={'_uri':'about-us'})]

Pour simplifier les choses, j'aimerais les regrouper comme :

main = [
  Route('/',StaticHandler, defaults={'_uri':'index.html'}),
  Route('/about-us', StaticHandler, defaults={'_uri':'index.html'})]

auth = [
  Route('/secure/', AuthHandler, defaults={'_uri':'secure.html'}),
  Route('/secure/<_uri>', AuthHandler, defaults={'_uri':'not-found.html'})]

redirect = [
  Route('/about.html', RedirectHandler, defaults={'_uri':'about-us'})]

Actuellement j'utilise :

master = main + auth + redirects

Ce qui fonctionne, mais je pense que je dois envelopper cela dans une propriété de classe pour le rendre mis en cache.

Jusqu'à présent, j'ai essayé:

class master(object):
  def __init__(self):
    self.list = list(set(main) & set(auth) & set(redirects))
  def __iter__(self):
    return iter(self.list)

Mais j'obtiens l'erreur "TypeError :L'objet 'type' n'est pas itérable".

J'ai donc besoin de 2 choses :

  1. Un moyen d'envelopper la liste combinée en tant que propriété de classe
  2. Un moyen de rendre la propriété pouvant être mise en cache (de préférence en tant que décorateur)

Ce que je ne veux pas gérer, c'est la surcharge supplémentaire occasionnée par la compilation d'une liste à chaque appel.

J'ai lu et utilisé un décorateur de propriétés en cache, mais je ne sais pas vraiment comment ils fonctionnent et/ou s'ils pourraient être facilement adaptés pour fonctionner avec des listes.

Note:Bien que artificiel, l’exemple présenté ici vise à simplifier les choses.L'objectif à long terme ici est de fournir 2 ensembles d'itinéraires différents en fonction de la configuration de l'application.

Était-ce utile?

La solution

Votre présomption de départ, que la liste des routes est calculée sur chaque demande, est fausse.Celles-ci sont définies au niveau du module, il sera donc calculé la première fois qu'ils sont importés, ce qui est lorsque chaque instance démarre.La compilation préalable ou la mémotrice ferait exactement la même chose.

Autres conseils

Je m'excuse si je vous ai mal compris, mais...Est-ce que cela ferait essentiellement ce que vous voulez ?..

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

class master(object):
    routes = a+b+c

if __name__ == '__main__':
    m = master()
    print m.routes

Rendements :

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Mais plus important..

a = master()
b = master()

b.routes.append(100)

print b.routes
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 100]

print a.routes
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 100]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top