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 :

Essai d'utilisation de fonctions provenant d'un module 1 dans un dictionnaire d'un module 2 [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Par défaut Essai d'utilisation de fonctions provenant d'un module 1 dans un dictionnaire d'un module 2
    L'esprit de mon code est d'utiliser autant que possible la programmation fonctionnelle pcq c'est plus pratique et surtout plus facile à lire et corriger.

    Voici l'arborescence du projet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    scrapy_project
     |_ scrapy.cfg
     |_ scrapy_project
          |_ __init__.py
          |_ module_parsing.py
          |_ module_correction.py
          |_ items.py
          |_ ...
          |_ spiders
                |_ crawling_spider.py
    `module_parsing.py` et `module_correction.py` sont des modules que j'ai créé.

    En résumé ce que ces modules contiennent:
    Dans le `module_parsing.py` on a ce genre de fonctions très simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
    import datetime as dt
    import dateparser
     
    def noms_entraineurs(response, arg_disc):
        """Return a list of names"""
        ent = parse instructions
        return ent
    etc.

    Et parce que je ne peux pas toujours anticiper les erreurs de parsing mais que je veux les corriger et pas manuellement pour faire des MAJ via un pipeline tout simplement, c'est pourquoi dans une méthode spécifique de mon spider j'ai envisagé une fonction, présente dans le module `module_correction.py`, dans laquelle se trouve un dictionnaire pour lequel la clé est le champ en str et le valeur est une fonction de parsing qui correspond à ce champ et se trouve dans le module `module_parsing.py`.

    Ça donne qqch comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from .module_parsing import *
    def fonction_parse_correction(
        field, response, arg_desc, arg_disc, arg_true_false):
     
        dico_fonction_parse = {
            'discipline': discipline(arg_desc),
            ...
            'entraineurs' : noms_entraineurs(response,
                                        arg_disc),
            ...
            }
        return dico_fonction_parse[field]
    Ainsi j’espérai avoir à écrire seulement ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction_parse_correction(field, response, arg_desc, arg_disc, arg_true_false)
    C'est ce que j'ai tenté de faire dans scrapy shell mais cela a échoué avec l'erreur : `NameError: name 'function_name' is not defined`

    L'essai dans scrapy shell

    J'ai lancé dans la console `scrapy shell https://website.com`

    Ensuite j'ai importé mes modules personnalisé et cela donne la chose suivante:

    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
    In [1]: import sys                                                              
     
    In [2]: sys.path.insert(0,'/home/user/directory_a/.../scrapy_project/scrapy_project')
     
    In [3]: from module_parsing import * 
        #ça marche bien donc la méthode d'importation est ok ici
        ...
    In [7]: from module_correction import * 
        ...
    In [10]: fonction_parse_correction('entraineurs',response,arg_desc,'attele',False)
     
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-10-137e645b094c> in <module>
    ----> 1 fonction_parse_correction('entraineurs',response,arg_desc,'attele',False)
     
    ~/.../scrapy_project/scrapy_project/module_correction.py in fonction_parse_correction(field, response, arg_desc, arg_disc, arg_true_false)
         50 
         51     dico_fonction_parse = {
    ---> 52     'allocation': allocation_devise(response)[0],
         53     'devise': allocation_devise(response)[1],
         54     'hippodrome':hippodrome_numreu_prix(response)[0],
     
    NameError: name 'allocation_devise' is not defined
    Et c'est là que je suis coincé, pcq je ne comprend pas l'erreur `NameError` alors que j'ai explicitement importé `module_parsing.py` dans le module `module_correction.py` afin d'obtenir les fonctions et leur noms de références.

    Notes:
    Ubuntu 18.04, Scrapy 1.5.2, Python 3.7.1

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    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 772
    Par défaut
    Salut,

    Python ne vous jette pas un NameError sans raison.
    Et s'il dit que "name 'allocation_devise' is not defined", c'est que c'est vrai.

    Si de votre côté vous prétendez qu'il devrait être défini via l'instruction "from .module_parsing import *", déjà, un print (allocation_devise) juste après devrait vous permettre de le vérifier.

    Et si ce n'est pas le cas, çà veut peut être dire que le module_parsing.py qui a été importé n'est peut être pas le bon.

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

  3. #3
    Membre confirmé Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Par défaut
    Après vous avoir lu, je suis tombé sur ce topic de stackoverflow.
    Donc j'ai dans le module `module_correction.py` écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from module_parsing import *
    qui cette fois n'a pas de point. Cette fois-ci ça marche, mais je ne comprends pas alors pourquoi je dois écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from .items import UnObjetCustomized
    dans d'autres fichier du même dossier alors que lorsque vous regardez dans mon arborescence `items.py` se trouve dans le même dossier que les modules qui me posaient problème précédemment. Donc un coup oublier "." est une cata, d'autre fois il faut l'enlever. Il y a sans doute une raison, mais elle m'échappe.

    Voici le nouveau test

    On relance scrapy shell
    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
    In [1]: import sys                                                                        
     
    In [2]: sys.path.insert(0,'/home/user/directory_a/.../scrapy_project/scrapy_project')       
     
    In [3]: from module_correction import *  #donc je n'importe pas l'autre module dans cette session afin d'être sûr que j'y ai accès via module_correction.py                                             
     
    In [4]: allocation_devise(response) #fonction présente dans module_parsing.py uniquement mais accessible via module_correction.py                                                 
    Out[4]: (35000, '€')
     
    In [5]: description = response.xpath("//html//div[@class='row-fluid row-no-margin text-lef
       ...: t']//strong/text()").extract()                                                    
     
    In [6]: description = ''.join(description)                                                
     
    In [7]: fonction_parse_correction('entraineurs',response,description,'attele',False)
    Mais j'ai une nouvelle erreur. En soi elle ne m'intéresse pas bcp je vais la régler toute seule avec la gestion des exceptions. Ce qui m'interroge c'est pourquoi la fonction est appelée alors que je ne fais pas appel à celle-ci:

    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
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-8-137e645b094c> in <module>
    ----> 1 fonction_parse_correction('entraineurs',response,description,'attele',False)
     
    ~/directory_a/.../scrapy_project/scrapy_project/fonctions_corrections.py in fonction_parse_correction(field, response, arg_desc, arg_disc, arg_true_false)
         54     'allocation': allocation_devise(response)[0],
         55     'devise': allocation_devise(response)[1],
    ---> 56     'hippodrome':hippodrome_numreu_prix(response)[0],
         57     'reunion' : hippodrome_numreu_prix(response)[1],
         58     'prix': hippodrome_numreu_prix(response)[2],
     
    ~/directory_a/.../scrapy_project/scrapy_project/fonctions_parsing.py in hippodrome_numreu_prix(response)
        157     #HIPPODROME
        158     if re.search('-\s{0,5}([A-Z|a-è-é|-|\s]+)\s{0,5}/', hip_num):
    --> 159         hippo = re.search('-\s{0,5}([A-Z|a-z-è-é|-|\s]+)\s{0,5}/', hip_num).group(1).lower().replace(' ','')
        160     else:
        161         hippo = None
     
    AttributeError: 'NoneType' object has no attribute 'group'
    Je rappelle que j'ai appelé la clé 'entraineurs' pas la clé 'hippodrome'. Pourquoi la fonction qui est la valeur de la clé 'hippdromme' appelle tout de même à exécuter la fonction?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    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 772
    Par défaut
    Salut,

    Citation Envoyé par AvySamaj Voir le message
    Après vous avoir lu, je suis tombé sur ce topic de stackoverflow.
    L'article d'OVF traite surtout du fait que les modules sont trouvés ou pas, et si "import" ne trouve pas le module à importer, vous aurez un message d'erreur qui se rapportera à la ligne qui effectue l'import.
    Dans votre cas, quelque soit la forme, l'import se passe bien, sauf que les symboles/variables créées ne sont pas les mêmes.
    L'hypothèse la plus vraisemblable reste que vous n'importez pas le même fichier... mais je ne vais pas regarder ce qui traîne dans les différents répertoires de votre disque dur à votre place.

    Citation Envoyé par AvySamaj Voir le message
    Pourquoi la fonction qui est la valeur de la clé 'hippdromme' appelle tout de même à exécuter la fonction?
    hippodrome_numreu_prix(response)[0] exécute la fonction hippodrome_numreu_prix avec pour argument response et assigne le premier élément de la séquence retournée comme valeur de la clef 'hippodrome'.
    Ce n'est peut être pas ce que vous vouliez, mais c'est pourtant ce que vous demandez à Python de faire.

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

  5. #5
    Membre confirmé Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Par défaut
    Je crois comprendre que le fait d'avoir écrit la forme
    voire
    la parenthèse fait que je l'appelle forcément.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZF 2.0] Utiliser une fonction d'un autre module
    Par xl-celine dans le forum MVC
    Réponses: 1
    Dernier message: 07/03/2013, 15h02
  2. Réponses: 3
    Dernier message: 03/07/2009, 09h58
  3. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04

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