1

Je suis un n00b en python (1h d'expérience derrière moi \o/ ), et malgré un certain nombre de recherches, je ne trouve pas comment faire un équivalent de $object = new $class() (en PHP) : un nom de classe est stocké dans une variable, et je veux créer une instance de cette classe.

Y a-t-il un moyen simple de faire cela ?


Modif :
Je vais exposer un peu plus mon problème, peut-être que je le modélise mal :
Je cherche à faire un outil de synchro de 2 bases de données de livres A et B.
J'ai donc des objets Livres (avec un identifiant, des données sur A, des données sur B, des dates d'ajout et de modifs sur A et B, des méthodes pour ajouter/changer/supprimer sur A ou B), et un objet BaseDeDonnées qui contient des objets Livres, avec des méthodes pour ajouter des Livres et synchroniser le tout.
Mais comme à terme je veux pouvoir réutiliser mon outil pour synchroniser mes bibliothèques de photos, de musique, mes historiques MSN, mes favoris Safari et mes fichiers de biblio, je veux faire :
une classe Ensemble qui contient des Elements
une classe BaseDeLivre qui contient juste le code de lecture des bases de données
une classe Livre qui va contenir le code pour ajouter/supprimer/modifier directement en base de données du bon côté
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

2

C'est pas super propre, mais tu peux peut-être t'en tirer avec la fonction eval() ? (j'ai pas beaucoup de python derrière moi non plus ^^)

Sinon le titre de ton topic n'a pas beaucoup de rapport avec le problème, et heureusement, sinon je pense qu'il aurait été très difficile de trouver une solution grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

J'ai vu avec eval, mais je trouvais ça *vraiment* moche
(Je ne savais pas comment trouver un titre concis grin , j'aurais dû mettre juste la ligne PHP qui explique bien, je trouve)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

4

Bon, j'ai trouvé une façon plus propre de contourner le problème :
ma classe Ensemble va avoir une méthode newElement() (créant par défaut un Element), qui sera surchargée par la classe BaseDeLivre par une méthode créant un Livre.

Bon, c'est tout de même assez chiant de faire des requêtes SQL en Python (plus exactement, la doc est vraiment mal fichue à ce niveau couic )
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

5

Bon, finalement, j'ai une autre question :

comme on fait pour faire une requête SQL en Python, _de façon propre_ ?

Concrètement, j'ai un dictionnaire DATA, et je veux construire une requête d'UPDATE (ou de SELECT)

Pour l'instant, je n'ai pas trouvé mieux que :
        query_data = ""
        count = 0
        values = [];
        for key,value in DATA.items():
            if count > 0:
                query_data = query_data + ","
            count = 1
            if value == None:
                query_data = query_data + key + "=NULL"
            else:
                values.append(value)
                query_data = query_data + key + "=?"
        query = "UPDATE ZENTRY SET " + query_data + " WHERE ZDATEADDED='" + self.uuid + "'" 
        DBDST.execute(query, values)
        DBDST.commit() 


Au passage, ça ne fonctionne pas, alors que j'ai les bonnes valeurs pour query et values :

UPDATE ZENTRY SET ZAUTHOR=?,Z_OPT=?,ZDATEEDITED=? WHERE ZDATEADDED='277901793.847'
[u'Philip K. Dick', 8, 278262834.77028799]


Mais je ne vois pas comment faire un truc simple *et* propre, et la doc ne précise rien à ce sujet tritop

avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

6

Je crois que "values" doit être un tuple et non un tableau, à vérifier (tu peux convertir un tableau en tuple avec l'opérateur tuple ()). Du coup, c'est pas forcément mieux et j'ai pas testé, mais tu peux tenter un truc de ce genre (un peu gore, mais si t'indentes proprement ça peut rester lisible ^^) :

DBDST.execute ("UPDATE ZENTRY SET " + ', '.join ([key + ' = ?' for key in DATA.keys ()]) + " WHERE blabla", tuple (DATA.values ()))
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

Merci pour le coup du join top

Par contre, j'ai beau transformer en tuple, ça ne marche pas mieux... Ça ne m'étonne pas, vu que ça ne râlait pas avec le tableau.

Comment peut-on voir la requête générée ?

Python est peut-être super bien pour plein de choses, mais je ne vois vraiment pas pourquoi ils ont fait ça comme ça et pourquoi ils n'ont pas été foutus d'ajouter des fonctions de base comme celles de PHP...
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

8

J'ai trouvé mon bug top
Ma requête est :
UPDATE ZENTRY SET ZAUTHOR = ?, Z_OPT = ?, ZDATEEDITED = ? WHERE ZDATEADDED='277901793.847'

La bonne clef vaut en fait 277901793.846898 , et il arrondit à 3 chiffres sans rien me dire...

Bon, maintenant, ça marche, merci Bob ! boing
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant