63 votes

Utilisez-vous l'instruction "globale" en Python?

Je lisais une question sur la déclaration globale Python ( « scope Python » ) et je me suis souvenu combien de fois je cette déclaration quand je débutais Python (je beaucoup mondial) et comment, de nos jours, des années plus tard, je ne ne l'utilisez pas du tout, jamais. Je le considère même un peu "non pythonique".

Utilisez-vous cette déclaration en Python? Votre utilisation en a-t-elle changé avec le temps?

56voto

Jerub Points 17488

J'utilise 'global' dans un contexte tel que celui-ci:

 _cached_result = None
def myComputationallyExpensiveFunction():
    global _cached_result
    if _cached_result:
       return _cached_result

    # ... figure out result

    _cached_result = result
    return result
 

J'utilise «global» parce que cela a du sens et que le lecteur de la fonction comprend clairement ce qui se passe. Je sais aussi qu'il existe un modèle équivalent, mais qui charge davantage le lecteur:

 def myComputationallyExpensiveFunction():
    if myComputationallyExpensiveFunction.cache:
        return myComputationallyExpensiveFunction.cache

    # ... figure out result

    myComputationallyExpensiveFunction.cache = result
    return result
myComputationallyExpensiveFunction.cache = None
 

15voto

ironfroggy Points 3496

Je n'ai jamais eu d'utilisation légitime de cette déclaration dans aucun code de production depuis plus de 3 ans que je suis une utilisation professionnelle de Python et plus de cinq ans en tant qu'amateur Python. Tout état que je dois changer réside dans des classes ou, s'il existe un état "global", il se trouve dans une structure partagée telle qu'un cache global.

10voto

Adam Rossmiller Points 61

Je l'ai utilisé dans des situations où une fonction crée ou définit des variables qui seront utilisées globalement. Voici quelques exemples:

 discretes = 0
def use_discretes():
    #this global statement is a message to the parser to refer 
    #to the globally defined identifier "discretes"
    global discretes
    if using_real_hardware():
        discretes = 1
...
 

ou

 file1.py:
    def setup():
        global DISP1, DISP2, DISP3
        DISP1 = grab_handle('display_1')
        DISP2 = grab_handle('display_2')
        DISP3 = grab_handle('display_3')
        ...

file2.py:
    import file1

    file1.setup()
    #file1.DISP1 DOES NOT EXIST until after setup() is called.
    file1.DISP1.resolution = 1024, 768
 

8voto

kender Points 18446

À mon avis, dès que vous ressentez le besoin d'utiliser des variables globales dans un code python, il est grand temps de s'arrêter un peu et de travailler sur la refonte de votre code.
Mettre la global dans le code et de retarder le processus de refactoring peut sembler prometteur si votre mort est proche, mais, croyez-moi, tu ne vas pas revenir sur ce et réparer, sauf si vous devez vraiment comme votre code cessé de travailler pour une raison étrange, vous avez à déboguer, vous rencontrez certains de ceux - global variables et elles ne font que gâcher les choses.

Donc, honnêtement, même s'il est autorisé, j'aimerais autant que je peux éviter de l'utiliser. Même si cela signifie un simple cours-construire autour de votre morceau de code.

3voto

JacquesB Points 19878

Les objets sont le moyen privilégié d'avoir un état non local, il est donc rarement nécessaire d'utiliser un état global. Je ne pense pas que le prochain modificateur non local sera largement utilisé non plus, je pense que c'est surtout là pour que les lispers cessent de se plaindre :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X