2013-04-10 15 views
6

Mam funkcję, którą wywołuję z modułu. W ramach tej funkcji dwie zmienne, do których próbuję uzyskać dostęp, stają się globalne. Gdy uruchomię moduł w IDLE sam, nadal będę mógł uzyskać dostęp do zmiennych po zakończeniu funkcji, zgodnie z oczekiwaniami. Kiedy zadzwonię do funkcji w kodzie, który zaimportowałem moduł do I nie mogę uzyskać dostępu do zmiennych.Uzyskiwanie dostępu do zmiennych globalnych z funkcji importowanego modułu

#module to be imported 

def globaltest(): 
    global name 
    global age 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 

Wyjście po uruchomieniu go samodzielnie.

>>> globaltest() 
What is your name? tom 
What is your age? 16 
>>> name 
'tom' 
>>> age 
16 

I kod, w którym należy go zaimportować.

import name_age 

name_age.globaltest() 

ale po uruchomieniu próbuję uzyskać dostęp do zmiennych w kodzie, w którym go zaimportowałem.

What is your name? tom 
What is your age? 16 
>>> name 

Traceback (most recent call last): 
File "<pyshell#10>", line 1, in <module> 
name 
NameError: name 'name' is not defined 
>>> 

Jak mogę sprawić, że zmienna globalna w kodzie gdzie mam importowanego modułu lub dostępu do „name” lub zmiennych „wiek” w funkcji.

Odpowiedz

1

Wystarczy zmienić swoje oświadczenie import do tego:

from name_age import * 

przykład:

In [1]: from name_age import * 
In [2]: print name 
Out[2]: 'tom' 

W przeciwnym razie, jeśli chcesz użyć instrukcji import name_age, wtedy masz dostęp do swoich global zmienne przez odniesienie do nazwy modułu, to jest:

przykład:

In [1]: import name_age 
In [2]: print name_age.name 
Out[2]: 'tom' 
+2

gwiazdowe import są tak zła jak globalnych. @badathings: _dont_ zrób to. –

+0

@bruno desthuilliers: ok, dzięki. –

+1

Od [PEP8] (http://legacy.python.org/dev/peps/pep-0008/#imports) * "Należy unikać importu symboli wieloznacznych (z import *), ponieważ sprawiają one, że nie jest jasne, które nazwy są obecne w przestrzeni nazw, myląc zarówno czytniki, jak i wiele zautomatyzowanych narzędzi ... "* – SiHa

3

Prosta odpowiedź brzmi "nie". Globale Pythona to tylko globale na poziomie modułów, a nawet globale na poziomie modułów (zmienne globale modułów) powinny być w jak największym stopniu unikane, a naprawdę jest bardzo mało powodów, aby z nich korzystać.

Właściwe rozwiązanie to nauczenie się prawidłowego stosowania par parametrów i zwracania wartości. W twoim przypadku pierwszym podejściem byłoby

#module.py 

def noglobaltest(): 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 
    return name, age 

a następnie:

from module import noglobaltest 

name, age = noglobaltest() 
print "name :", name, "age :", age