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 :

est-ce que le underscore devant un nom de variable a un sens particulier ou c'est juste conventionnel ?


Sujet :

Python

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 395
    Points : 863
    Points
    863
    Par défaut est-ce que le underscore devant un nom de variable a un sens particulier ou c'est juste conventionnel ?
    bonjour,

    je voudrais savoir si le underscore qu'on peut mettre devant un nom de variable a un sens, une incendice particulière ou pas ? est-ce juste conventionnel, une habitude de présentation ou bien est-ce que ça joue un rôle dans la visibilité, instanciation d'une variable ?

    je pose cette question car je suis en train de manipuler un webservice (.asmx) pas fait ni testé pour python, et comme ce WS possède des noms de champs/type avec un underscore devant je me pose des questions.
    Avec mon client soap (suds), je n'arrive pas à envoyer mon id de connexion dans ce WS qui comme par hasard possède un underscore devant le nom !
    Alors que les autres variables/type sans underscore j'arrive à les envoyer. !

    Voiç la description de la méthode fournie par le WS :
    EnvoiIntervenants(xs:string _IdConnexion, ArrayOfIntervenant _ListeIntervenant, )
    avec mon code çi-dessous j'arrive donc à envoyer l'intervenant mais pas l'id de connexion où la réponse de WS me dit qu'il est vide !!!!

    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
    client = Client(url)
    		print client	#pour voir schema global, definitions..Etc
     
    		Intervenant = client.factory.create('Intervenant')
    		print Intervenant
     
                    Intervenant.Matricule="TEST matricule"
    		Intervenant.Civilite=1
    		Intervenant.Prenom="TEST prenom"
    		Intervenant.Nom="TEST NOM"
    		Intervenant.TelPerso="TEST telperso"
    		Intervenant.CodePostal="TEST cp"
    		Intervenant.Ville="TEST ville"
    		Intervenant.Adresse="TEST adresse"
    		Intervenant.Suppression=False
     
    		try:
    			nouveau = client.service.EnvoiIntervenants("mon id",Intervenant)
    		except suds.WebFault, e:
    			print e

    Si quelqu'un a une idée........je planche dessus depuis plusieurs heures........

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est plus effectivement par convention d'écriture. Cela signifie 'pas touche'/'interne' mais rien n’empêche l'utilisation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> class Foo(object):
    ...     _l = []
    ... 
    >>> Foo._l
    []
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Bonjour,
    Python met l'accent sur le bon sens des développeurs qui l'utilisent. Par convention on accède pas à un champs ou une méthode marqué d'un "_". On le pourrait, python ne nous ne l'interdit pas, mais on ne le fait pas. Python ne possède pas de public/private comme en java et en C++.
    On utilise normalement cette notation pour définir une propriété :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A:
        def __init__(self, a):
            self._a = a
     
        def _get_a(self):
            return self._a
     
        def _set_a(self, a):
            self._a= a
     
        a = property(_get_a, _set_a)
    L'utilisation de cette classe sera :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = A("Test")
    print a.a
    a.a = "Autre test"
    print a.a
    Désolé pour l'exemple bidon, mais j'espère que tu as compris.

    [EDIT]Grillé . Trop lent à répondre[/EDIT]

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Petit note quand même:
    _ empêche l'import

    Soit test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class _interne():
        def __init__(self):
            pass
     
        def _myprint(self):
            print('pass')
     
    class Foo():
        def __init__(self):
            pass
     
        def look_interne(self):
            _i = _interne()
            _i._myprint()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from test import *
    >>> globals()
    {'__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', 'Foo': <class 'test.Foo'>, '__doc__': None, '__package__': None}
    >>> f = Foo()
    >>> f.look_interne()
    pass
    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    Voici ce que dit le PEP8 dans la partie Naming Conventions.

    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
        In addition, the following special forms using leading or trailing
        underscores are recognized (these can generally be combined with any case
        convention):
     
        - _single_leading_underscore: weak "internal use" indicator.  E.g. "from M
          import *" does not import objects whose name starts with an underscore.
     
        - single_trailing_underscore_: used by convention to avoid conflicts with
          Python keyword, e.g.
     
          Tkinter.Toplevel(master, class_='ClassName')
     
        - __double_leading_underscore: when naming a class attribute, invokes name
          mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).
     
        - __double_leading_and_trailing_underscore__: "magic" objects or
          attributes that live in user-controlled namespaces.  E.g. __init__,
          __import__ or __file__.  Never invent such names; only use them
          as documented.
    @++
    Merci d'utiliser le forum pour les questions techniques.

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Ceci dit, et bien que je l'utilise comme 'signalétique', cela vas qu'en même a l'encontre du fait qu'en Python on considère le développeur comme 'responsable'...
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 395
    Points : 863
    Points
    863
    Par défaut ok
    pour infos, concernant mon webservice *.asmx....

    j'ai contacté les responsables de la partie serveur, et m'ont fait une version sans les underscores devant les noms de propriété/méthode et....miracle ça marche maintenant avec SUDS...

    qui était le fautif : suds ou le webservice .net ?

    peu importe ça marche maintenant, en tout cas ce problème est réglé...

  8. #8
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Le fait est que si le développeur de la classe a mis un "_" devant l'id, c'est que tu n'es pas censé l'utiliser. L'id devait donc être un champs qui se remplissait en interne par la classe. Maintenant que tu as prévenu les développeurs de la classe, ils t'ont fait une version qui te permet de le modifier. C'est tout !

Discussions similaires

  1. underscore devant le nom d'une variable
    Par root76 dans le forum Langage
    Réponses: 23
    Dernier message: 12/06/2013, 13h31
  2. Est-ce que je peux utiliser certain symbole dans le nom de dossier
    Par pierrot10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 24/09/2007, 20h45
  3. Réponses: 7
    Dernier message: 08/03/2007, 09h23
  4. Qu'est-ce que N devant certaines string ?
    Par Foxtrot dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/10/2006, 23h09
  5. Que veut dire le "T" devant un nom de classe?
    Par Jhulk dans le forum Delphi
    Réponses: 5
    Dernier message: 08/06/2006, 08h39

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