1

Salut, j'ai un erreur python:
Traceback (most recent call last):
File "D:/Documents and Settings/ab81013/Desktop/host/Code/test.py", line 1, in <module>
import FileStream
File "D:/Documents and Settings/ab81013/Desktop/host/Code\FileStream.py", line 6, in <module>
class FileStream(StreamProvider):
TypeError: Error when calling the metaclass bases
module.__init__() takes at most 2 arguments (3 given)

Avec les sources suivantes:
# Interface pour le recepteur de trace sous forme de paquet

class StreamProvider:
    def getChar(self):
        raise NotImplementedError


et

# -*- coding: cp1252 -*-
# Implementation de l'interface StreamProvider pour gérer les fichier

import StreamProvider

class FileStream(StreamProvider):
    def __init__(self, fileName):
        __file = open(fileName, R_OK)
    def getChar(self):
        return __file.read(1)

    def __del__(self):
        __file.close()


Je ne comprend pas pouquoi il me parle de 3 arguments fournis... :/

2

Je ne comprends pas non plus l'erreur, mais ta classe abstraite StreamProvider ne sert à rien! Python pratique le "duck typing", ce qui fait que ça ne sert strictement à rien d'hériter d'une classe juste pour l'interface. L'héritage en Python sert uniquement à hériter l'implémentation, le polymorphisme n'en dépend pas. Par conséquent, une classe purement abstraite est totalement inutile.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Heu en fait je veux faire une inversion de dépendence (pattern design).
Et pour cela je dois normaliser les interfaces. En gros l'interface abstraite n'a que cette pretention la.

4

Kevin : avoir du code explicite c'est pas mal non plus, le runtime n'est pas la seule chose qui importe.

5

Non mais je peux utiliser le duck typing et donc ne pas dériver de StreamProvider. Ok, mais je dois dire que je ne suis pas encore très familiarisé avec cela. Dans tous les cas la classe StreamProvider doit exister. C'est le principe meme de l'inversion de dépendance, et aussi du duck typing. Pour qu'il y ai un duck typing, il faut bien un duck wink

6

Bon j'ai trouvé la solution, mais maintenant je ne sais pas comment declarer une variable sans l'initialisé et c'est relativement chiant:
# -*- coding: cp1252 -*-
# Implementation de l'interface StreamProvider pour gérer les fichiers

import StreamProvider

class FileStream(StreamProvider.StreamProvider):
    def __init__(self, fileName):
        self.f = open(fileName, 'r')
    def getChar(self):
        return self.f.read(1)

    def __del__(self):
        self.f.close()   

-> je suis obligé de mettre self :/

7

si tu mes pas self, python saura pas que c'est un attribut de ta classe...
je vois pas en quoi c'est chiant d'avoir a initialiser une variable.. enfin, generalement, tu mets un None et vu que c'est un typage dynamique tu attribues a ce que tu veux apres...

8

En fait je galere parceque je cherche a programmer comme en C++.

9

Ha ben non, en python il faut oublier ce genre de réflexe. Tu aurais d'ailleurs sans doute le même genre de soucis avec plein d'autres langages objets smile
avatar
Il n'a pas de mots
Décrire son mépris
Perdre les rênes
Il a perdu la foi

10

JackosKing (./5) :
Pour qu'il y ai un duck typing, il faut bien un duck wink

Non, justement non, vu que tu n'as besoin de donner un type à tes paramètres.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

Ouai je viens de constater, en gros ca fait un peu chier parce que du coup ya des design pattern qui partent en fumée... :/

12

Explique plus en detail alors, pke je vois pas ce qui te fait chier la?

13

bein en gros l'inversion de dependance a pour but de mettre une dependance sur une interface et non sur autre chose.
Ce qui permet de normaliser l'interface et aussi d'inverser la dependance (meme si c'est local) pour isoler les couches
Exemple:
A depend de B
normalement on fait:
A depend de C.
B depend de C.

ici je peux pas faire dependre vers un type il me semble a cause de ce qu'a dit kevin. -> j'ai pas la possibilité de faire ce pattern :/
Bon je dois dire que c'est pas bien grave pour ce programme la, mais en utilisant python en orrienté objet, je comptais juste voir la limitation de ce langage (a moins que je me sois planté).
Ici en fait si on remarque bien c'est la runtime python qui va s'occuper de ca. Perso ca me plait pas trop mais bon.

14

La différence avec les langages fortement typés est que le contrat est implicite (le contrat est vérifié à l'exécution). Python n'impose pas l'utilisation d'éléments techniques (type interface Java ou classes C++ abstraites) pour décrire le contrat. Mais rien ne t'empêche de le définir dans une classe techniquement inutile comme tu le faisais dans ./2 pour rendre ça explicite. Tu pourrais même avoir une description textuelle si c'est plus simple à écrire ou plus lisible.

Faire le choix d'un langage dynamique comme Python c'est déplacer une partie des validations normalement faites au moment de la compilation vers des validations à l'exécution. Ca a ses avantages (plus de souplesse, moins de lourdeur) et ses inconvénients (plus de risques), mais en tout cas ce n'est pas ça qui t'empêche de vers de l'inversion de dépendance, loin de là.

15

Oui c'est vrai... faut que je m'habitue.

Sinon on est obligé de mettre l'attribut self.maMethode self.maVar dans une classe?
Parce que cela devient très vite lourd :/

16

ouais, oblige, comme pour les methodes, oblige de mettre self comme premier parametre.
ouais, ca saoule, mais bon...

17

Heu j'ai une question sur python et son interfacage en C.
Je cherche a passer une liste à une fonction C.
En gros faire un truc comme ca:
>>maFunc([2,3,4])

J'ai trouvé celà:
http://www.gmu.edu/mlnavbar/webdev/doc-python/ext/parseTuple.html
mais je n'ai rien vu sur les tableaux (passer super vite dessus, overbook).

voilà si qqn maitrise ca me ferai gagne pas mal de temps (ou alors un mot clee).

Merci

18

Regarde du cote de Python2.5 ctypes

19

merci.

20

C'est que depuis python2.5 par contre, donc portabilite moyenne, et je pense que ca ne marche qu'avec du C (pas C++)

21

Ça marche sur Fedora >=7, ce qui est suffisamment portable AMHA. tongue
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

22

Non, la 7 est sortie fin mai 2007, on est TRES loin d'une distribution utilisable dans un environnement de production.
Tout dépend donc de ce qu'il souhaite faire de son code, mais si c'est pour un truc industriel, il peut déjà faire une croix dessus.
avatar
Il n'a pas de mots
Décrire son mépris
Perdre les rênes
Il a perdu la foi

23

on s'en fou de ca...
ca n'a rien a voir avec le sujet... ca marche tant que python 2.5 est supporte, c'est tout ce qu'il y a a dire.

24

kim (./22) :
Non, la 7 est sortie fin mai 2007, on est TRES loin d'une distribution utilisable dans un environnement de production.

Bah, ceux qui en sont toujours à FC6 commencent à être mal fichus parce que les mises à jour de sécurité vont arrêter dans environ 2 mois (1 mois après la sortie de F8). FC5 n'est déjà plus supporté. Pour un "environnement de production" parano à ce niveau, il y a RHEL ou CentOS, mais à ce moment-là il ne faut pas s'attendre à pouvoir faire tourner les logiciels récents tout de suite. Soit on veut les nouveautés, soit on ne les veut pas.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

25

Ouvrez un autre topic pour parler de ca.

26

Bon alors pour python:
Appeler une methode d'une classe python en C: PyObject_CallMethodObjArg
Pour une liste en argument: 2.1.4 Subclassing other types
Pour obtenir la valeur d'un item d'un array de int: PyIntAsLong.

Voilà je devrais avoir tout ce qu'il me faut.

27

Bon ca segfault grave la:/