2011-12-30 5 views
5

Je me demandais si quelqu'un avait des idées sur l'utilisation de Python globale par rapport au référencement du module lui-même. Alors que dans le passé, je mondial en cas de besoin, je l'ai trouvé un peu plus clair à faire la deuxième méthode (et, récemment, tend à favoriser cette syntaxe):Utilisation de Python de global vs spécification du module

import sys 
mod = sys.modules[__name__] 

counter = 0 

def incrementGlobal(): 
    global counter 
    counter += 1 

def incrementMod(): 
    mod.counter += 1 

Il est évident que les deux fonctionnent très bien, mais si quelqu'un a des opinions fortes (quoi de plus pythonique, performance etc), j'adorerais les entendre. Btw Je finis par utiliser l'un ou l'autre de ces cas dans des situations où le module encapsule naturellement toutes les méthodes et attributs de ce qui serait une seule classe, et plutôt que de faire référence à incrementmodule.IncrementClass.counter, je peux simplement utiliser incrementmodule.counter.

+2

Comment le second est-il plus clair? – delnan

+0

Je suppose que ce n'est pas beaucoup plus clair, mais je préfère car il est immédiatement évident qu'une variable au niveau du module est en cours de modification, plutôt qu'une variable locale (vous empêche de vérifier si la variable est dans la déclaration globale en haut) – gnr

+3

Si le 'global' et l'affectation sont si loin, vous avez des problèmes de clarté pire que cela;) – delnan

Répondre

5

Optez pour global à chaque fois. Le mot-clé global est un motif évident et facilement reconnaissable pour modifier quelque chose au niveau du module. Donner à un module une référence à lui-même à partir de sys.modules semble une manière inutilement alambiquée de contourner ce problème, et risque de dérouter le programmeur suivant qui le regarde.

3
  • Performance: en utilisant le style global sera imperceptiblement plus vite, car il a besoin qu'un seul nom recherche au lieu de deux (serait que de la matière dans une boucle serrée de plusieurs milliers).

  • Style: le style mod.xxx reflète la façon dont vous accéder GLOBALS d'un autre module que vous avez importé:

`

import foo 
foo.eggs = 'scrambled' 

La méthode global est plus fréquente, mais votre mod.xxx La méthode est également facile à comprendre et très lisible.

+2

Aucun downvote, mais en utilisant 'global' est beaucoup plus commun que d'utiliser' mod.xxx', donc je dirais que l'utilisation de 'global' est plus lisible, parce que c'est ce que presque tout le monde attend. – EOL

+0

@EOL: convenu que «global» est la méthode qui prévaut, et le plus immédiatement reconnaissable. –