IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Fonction de filtre en cascade


Sujet :

Python

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut Fonction de filtre en cascade
    Hello,
    Alors voilà je cherche à faire une fonction qui filtre des trames suivant certains critères, j'ai une zone de texte dans laquelle je rentre mes filtres (un peu a la manière de IpTable) par exemple :
    - DB_WAVEFORMS:Filter , EVT_VALUE_CHANGE:Allow
    J'aimerais que ça marche en cascade c'est à dire si je reçoit une trame qui contient DB_WAVEFORMS et aussi EVT_VALUE_CHANGE, qu'il m'affiche la trame, mais si je reçoit juste DB_WAVEFORMS,ça filtre.
    Donc voila, je bloque au niveau de la "cascade".
    Celle-ci doit être dans l'ordre du des mes filtres c'est a dire si je reçoit un DB_WAVEFORMS qui contient un EVT_VALUE_CHANGE dans cette config, je ne l'affiche pas:
    - EVT_VALUE_CHANGE:Allow, DB_WAVEFORMS:Filter

    Sachant que mes filtres sont stocké dans un dictionnaire

    Voila ma fonction de filtre ( sans la cascade):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    def __is_value_allowed_dict(self,key):
    		try:
    			if(self.FilterDict[str(key)] == "Filter"):
    				return False
    			else:
    				return True
    		except:
    			print("__is_valued error")
     
    	def frame_should_be_filtered_dict(self, Decoded_frame):
    		if(type(Decoded_frame) is list):
    			cpt = 0
    			for item in Decoded_frame :
    				if(type(item)is list):
    					try:
    						if(item[0] in self.FilterDict.keys()):
    							if not (self.__is_value_allowed_dict(item[0])):
    								cpt += 1
    						else:
    							pass
    					except Exception as e:
    						print("EXCEPT IT" + str(e))
    				try:
    					if(item in self.FilterDict.keys()):
    						if not (self.__is_value_allowed_dict(item)):
    							cpt += 1
    					else:
    						pass
    				except:
    					pass
    			if(cpt < 1):
    				return False
    			elif(cpt > 0):
    				return True
    Quelqu'un autre une idée , une piste ? une soluce ? ^^
    Merci d'avance !

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Quand on voit les indentations de ton code, on se dit que quelque chose a foiré dans le copier-coller, mais bon, on devine plus ou moins.

    Tu devrais préciser ce qui ne va pas. La fonction ne retourne pas ce qui est attendu ?

    Ton code comporte beaucoup de choses inutiles, c'est affaire de style, mais, en simplifiant on peut mieux comprendre ce qui se passe.

    Ton code devrait se résumer à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        def __is_value_allowed_dict(self, key):
            return self.FilterDict[key] == "Filter":
     
        def frame_should_be_filtered_dict(self, Decoded_frame):
            if isinstance(Decoded_frame, list):
                cpt = 0
                for item in Decoded_frame :
                    if isinstance(item, list):
                        item = item[0]
                    if item in self.FilterDict.keys():
                        cpt += self.__is_value_allowed_dict(item)
     
                return cpt
    La fonction retournera None si Decoded_frame n'est pas une liste. C'est prévu comme ça ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par IPreferCSharp Voir le message
    Alors voilà je cherche à faire une fonction qui filtre des trames suivant certains critères, j'ai une zone de texte dans laquelle je rentre mes filtres (un peu a la manière de IpTable) par exemple :



    Quelqu'un autre une idée , une piste ? une soluce ? ^^
    Je n'ai peut être pas tout compris mais, j'ai l'impression que c'est plutôt une "question de design" plutôt que de "codage".
    Et... tel que j'ai compris la question, il vous serait peut être utile de regarder un design pattern POSA appelé "pipes and filters pattern".
    A vous de voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut
    Merci pour vos réponses!

    Effectivement beaucoup de code inutile, merci des conseils !
    Decode_Frame est obligatoirement une liste si non il y a eu un problème.

    J'ai adapté la fonction __is_value_allowed à mon besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	def __is_value_allowed_dict(self, key):
    		if self.FilterDict[key] == "Filter":
    			return  1
    		elif self.FilterDict[key] == "Allow":
    			return  -1
     
    	def frame_should_be_filtered_dict(self, Decoded_frame):
    		if isinstance(Decoded_frame, list):
    			cpt = 0
    			for item in Decoded_frame :
    				if isinstance(item, list):
    					item = item[0]
    				if item in self.FilterDict.keys():
    					cpt += self.__is_value_allowed_dict(item)
    			return cpt
    Le code fait ce que je veux mais comporte une limitation gênante
    Toujours avec le même exemple de filtre :
    DB_WAVEFORMS:Filter , EVT_VALUE_CHANGE:Allow
    Pour une trame contenant
    [item,DB_WAVEFORMS,EVT_VALUE_CHANGE]
    La fonction marche très bien, par contre si elle est sous cette forme :
    [item,DB_WAVEFORMS,EVT_VALUE_CHANGE,DB_WAVEFORMS]
    ça ne marche plus, mon filtre indique une priorité au EVT_VALUE_CHANGE mais le second DB_WAVEFORMS fait que elle est considéré comme filtrée.

    Merci aussi pour le conseil du pipes and filters pattern, je vais regarder ce que c'est !

Discussions similaires

  1. fonction qui filtre les entrées d'un input text
    Par benthebest dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/03/2010, 16h37
  2. [SSAS] [2K5] Filtres en cascade
    Par Bonebone dans le forum SSAS
    Réponses: 4
    Dernier message: 11/08/2009, 16h47
  3. Réponses: 1
    Dernier message: 11/05/2009, 17h39
  4. Appliquer fonction sur filtre
    Par laly94 dans le forum Excel
    Réponses: 7
    Dernier message: 20/08/2008, 15h43
  5. Filtres en cascade
    Par inluvwitiou dans le forum Deski
    Réponses: 8
    Dernier message: 12/03/2007, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo