2010-08-10 10 views
0

code Exemple d'un module:Comment utiliser les paramètres nommés et les variables globales avec le même nom dans Python?

somevar = "a" 

def myfunc(somevar = None): 
    # need to access both somevars ??? 
    # ... if somevar was specified print it or use the global value 
    pass 

if __name__ == '__main__': 
    somevar = "b" # this is just for fun here 
    myfunc("c") 
    myfunc() # should print "a" (the value of global variable) 

Il y a au moins deux raisons d'utiliser le même nom: l'éducation (pour apprendre à utiliser globals locales /) et de l'utilisation des modules.

Disons que ce code fait partie de votre module: mymodule et que vous voulez faire des choses comme:

import mymodule 

mymodule.samevar = "default" 
... 
mymodule.myfunc(somevar = "a") 
... 
mymodule.myfunc() 

Comme vous pouvez l'imaginer dans cet exemple est simplifiée, imaginez que somevar paramètre est l'un des nombreux en option paramètres et que myfunc est appelé dans de nombreux endroits.

+1

Avez-vous essayé les mots-clés 'global' et 'local'? – NickHalden

+1

si le deuxième appel imprime vraiment "C", ou devrait-il être "a" à la place? – theomega

+0

@theomega: merci d'avoir remarqué cela, j'ai corrigé l'exemple. – bogdan

Répondre

5

De loin la meilleure approche, comme le disent les autres réponses, est d'éviter ce très, très mauvais design: n'utilisez pas les mêmes noms pour deux choses différentes! Si vous êtes bloqué dans ce terrible design, peut-être parce que l'architecte suprême de votre entreprise l'a décrété et qu'il est tout simplement non négociable (par exemple, il y a des tonnes de code client qui s'appuient sur le nom et le paramètre) La première chose à faire pour vous est de vous assurer que votre CV est à jour, de l'imprimer sur la meilleure imprimante, et de commencer à contacter les membres de votre réseau social pour trouver un emploi dans un endroit plus raisonnable; Ensuite, pour éviter de perdre l'assurance maladie jusqu'à ce qu'un meilleur travail se trouve, essayez

def myfunc(somevar = None): 
    if somevar is None: 
     print globals().get('somevar') 
    else: 
     print somevar 

J'ai aussi renommé votre -myfunc parce que c'est le nom qu'il est d'être appelé avec (bien que compte tenu de la conception incroyablement mauvaise votre hypothétique Supreme Architect semble être en mesure de perpétrer, peut-être aussi a précisé que la fonction soit appelée par un nom différent de celui avec lequel elle est définie? Semble aller avec le conflit de nom systématique de ce type hypothétique mais déjà assez haineux est supposé avoir imposé sur vous! -).

+0

Vous êtes vraiment drôle et utile! J'ai corrigé les fautes de frappe de l'exemple. Maintenant, je vais mettre à jour la question et vous expliquer pourquoi j'étais intéressé par l'utilisation du même nom. – bogdan

+0

@bogdan, merci pour le kudos _et_ la clarification. Dans l'idiome Python, lorsqu'une valeur doit avoir une valeur par défaut générale mais peut être remplacée par appel avec des valeurs spécifiques, la première est généralement nommée avec un préfixe 'default_' - par exemple, voir le module socket,' getdefaulttimeout' et ' Les fonctions setdefaulttimeout' et le paramètre nommé 'timeout' pour différentes fonctions (en utilisant les fonctions getter et setter dans ce cas, plutôt que" juste une variable globale ", est aussi commun, puisque _modules_ ne peut pas utiliser le built-in' property', ce qui permet de toujours éviter les getters/setters dans _classes_). –

0

Deux solutions:

  1. Renommez la variable c.-à-somevar_.
  2. Déplacez le global vers un autre module. Vous pouvez écrire un module myappdefaults

    import myappdefaults 
    print myappdefaults.somevar 
    
1

Pourquoi vous ne la variable locale doivent avoir le même nom que la variable globale? Renommer l'un d'eux semble être une solution simple. Une autre option consiste à passer la variable globale en paramètre, mais cela ne vous donnera qu'un nom de variable différent pour accéder à la valeur d'enregistrement.

0

C'est la bonne façon de faire les choses.

somevar = "a" 

def mufunc(_somevar = None): 
    global somevar 
    if _somevar: 
     print _somevar 
    else: 
     print somevar 

if __name__ == '__main__': 
    global somevar 
    somevar = "b" 
    myfunc("c") 
    myfunc() $ should print "c" 
Questions connexes