Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Détecter un changement dans une classe python

+4 votes

Mon problème est le suivant :
Est - il possible de détecter lorsqu'une classe python a été modifiée, un peu de la même façon qu'il est possible de savoir si un fichier a été altéré via un hash md5 ?

Ayant besoin à la fois d'optimiser un calcul scientifique et de communiquer avec des afficionados Fortran, j'ai écrit un bout de code permettant de transformer une équation sympy (calcul formel) en code fortran, et d'ensuite le compiler via f2py, de l'importer et de l'utiliser pour effectuer mes calculs.

Cette étape de traduction / compilation est (relativement) longue. J'aimerai donc ne la faire que lorsque mon modèle mathématique change.

Celui ci est écrit sous une forme du genre

class Chris2DModel(Model):
name = 'Saint_Venant_vg_hydro2fields'

def set_model(self):
    t = self.t
    x = self.x

    h = sp.Function('h')(x, t)
    q = sp.Function('q')(x, t)

    self.funcs = h, q
    self.pars = Re, We, Ct = sp.symbols('Re We Ct', cls=sp.Symbol)

    continuity = (h.diff(t) + q.diff(x)).expand()
    inertial = (3. * Re * (q.diff(t) +
                           frac(17, 7) * q / h * q.diff(x) -
                           frac(9, 7) * q**2 / h ** 2 * h.diff(x)) - (
        frac(5, 6) * (h -
                      3 * q / h**2 -
                      Ct * h * h.diff(x) +
                      We * h * h.diff(x, 3)) +
        4. * q * (h.diff(x) / h) ** 2 -
        frac(9, 2) * h.diff(x) * q.diff(x) / h -
        6. * q * h.diff(x, x) / h +
        frac(9, 2) * q.diff(x, x)
    )
    ).expand()

    return [continuity, inertial]

Ce modèle hérite d'une classe plus générale possédant toutes les méthodes permettant la résolution numérique de l'équation.

L'objectif est de ne lancer l'étape de trad/compile que si un changement a été détecté dans le modèle mathématique.

demandé 27-Dec-2015 par Poisson (272 points)
edité 28-Dec-2015 par foxmask

Travailler avec des patchs? Generer et echanger des patchs lorsque l'on modifie la classe et si patch il y a, declencher compilation?

Jython pourrait contourner ton probleme:

Conférence COMPIL du 25/11/10

3 Réponses

+2 votes
 
Meilleure réponse

Si celui qui change l'équation est sur python, j'aurai pensé à un pattern observer ?

J'ai cru comprendre que des "vieux" hydrologistes Fortranistes allaient modifier d' eux même l' équation si les mesures ne collent au modèle théorique
ou si ils changent de lieu d'étude , ils vont seulement changer les valeurs de h,t,x .

tu pourrais avoir une équation-mémoire, que tu compares à intervalle régulier. Pourquoi pas en faire une string ?

Ou bien avoir un tableau de valeurs-étalons avec h,t,x pré-déterminées et comparer les nouvelles valeurs pour voir si ça a changé.

Si tu peux faire ça, alors tu automatises pour que ça sérialise l'équation en JSON et que ça POST automatiquement sur ton serveur flask qui enchaine la compilation dès réception, même si c'est la nuit est que tu es en train de dormir.
Au réveil, c'est déjà compilé !

répondu 31-Dec-2015 par buffalo974 (2,956 points)
sélectionné 2-Jan-2016 par Poisson

Je pourrais faire ça effectivement, il faut que je fige vraiment le format de l'équation (pour le moment j'ai soit des string qui sont moulinés par Sympy, soit une équation sympy directement). Si je me restreint aux string, je peux sauvegarder celle ci et comparer au lancement. Par contre, pas besoin d'aller dormir : la compilation dure 2-10 min (pour le moment), mais ça reste long, ce sont des modèles qui sont censés être rapide (~1 min pour la résolution).

Je regarde ce que ça peut donner!

+1 vote

Si le modèle de calcul change, le module python aussi ? Donc pourquoi ne justement pas utiliser os.stats() ?

répondu 28-Dec-2015 par foxmask (2,892 points)

Le fichier contient plusieurs modèles. Avec os.stats(), je devrais tout recompiler si un modèle change (ce qui prendrais un temps non négligeable). Sinon, il faudrait que je sépare les modèle avec 1 modèle / fichier. J'aimerai une façon plus élégante de faire ça, mais je garde cette option en réserve.

+4 votes

Pour moi, il s'agit avant tout d'un problème de logique de programmation.

Si tu souhaites faire cela, il vaudrait peut être mieux prévoir des accesseurs aux attributs et méthodes de ton instance et y insérer un comportement complémentaire plutôt que de chercher absolument à détecter tout type de changement au niveau de l'objet, ce qui nécessite un haut niveau d'introspection et qui n'est pas sans faille.

répondu 28-Dec-2015 par debnet (1,024 points)
...