2013-04-10 2 views
6

У меня есть функция, которую я вызываю из модуля. Внутри функции две переменные, которые я пытаюсь получить, становятся глобальными. Когда я запускаю модуль в IDLE сам по себе, я могу получить доступ к переменным после завершения функции, как и ожидалось. Когда я вызываю функцию в коде, в который я импортировал модуль, я не могу получить доступ к переменным.Доступ к глобальным переменным из функции в импортированном модуле

#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? ")) 

Выход, когда я запускаю его сам по себе.

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

И код, в котором его импортировать.

import name_age 

name_age.globaltest() 

но когда я пытаюсь получить доступ к переменным в коде, где я его импортировал.

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 
>>> 

Как я могу сделать переменную глобальной в коде, где я импортирован модуль или получить доступ к «имя» или «возраст» переменные в функции.

ответ

1

Просто измените import заявление этого:

from name_age import * 

пример:

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

В противном случае, если вы хотите использовать import name_age заявление, то вы должны получить доступ к global переменных через ссылку на название модуля, то есть:

пример:

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

импорт звезды примерно как зло, как глобалов. @badathings: _dont_ сделать это. –

+0

@bruno desthuilliers: хорошо, спасибо. –

+1

Из [PEP8] (http://legacy.python.org/dev/peps/pep-0008/#imports) * «Следует избегать импорта подстановочных знаков (от import *), поскольку они не позволяют понять, какие имена присутствуют в пространстве имен, запутывая как читателей, так и множество автоматизированных инструментов ... »* – SiHa

3

Простой ответ "нет". «Глобалы» Python - это только глобальные глобулы на уровне модулей, и даже глобальные глобулы на уровне модулей (изменяемые глобальные глобальные уровни) следует избегать как можно больше, и их очень мало.

Правильным решением является научиться правильно использовать параметры функции и возвращать значения. В вашем случае первый подход будет

#module.py 

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

, а затем:

from module import noglobaltest 

name, age = noglobaltest() 
print "name :", name, "age :", age 
Смежные вопросы