2013-10-07 2 views
0

Я не могу записать глобальную переменную в следующую программу. Может кто-нибудь, пожалуйста, дайте мне решение? Обратите внимание, что моя var переменная должна быть в другом файле, чем Mod2.py и Mod3.pyНе удается получить глобальную переменную в Mixin

В Mod1.py

var = 5 

В Mod2.py

from Mod1 import * 

def foo(newValue): 
    global var 
    print('foo: %d' % var) 
    var = newValue 

print('before: %d' % var) 
foo(2) 
print('after: %d' % var) 

В Mod3.py

from Mod2 import * 

foo(3) 
print('var: %d' % var) 

Результат при запуске Mod3.py

before: 5 
foo: 5 
after: 2 
foo: 2 
var: 2 

Но я ожидаю, что это будет

before: 5 
foo: 5 
after: 2 
foo: 2 
var: 3 

Я не хочу, решение с использованием import Modx.py

+2

Извините, но это очень плохой питон. Не могли бы вы объяснить, зачем вам это нужно? – georg

ответ

0

Я не хочу, решение с использованием import Modx.py

Это невозможно , Единственный способ сделать то, что вы хотите, - это переустановить имя в другом модуле, и это требует импорта и доступа к модулю, а не имени напрямую.

2

Это, вероятно, связано с тем, что импорт переменных не, как вы могли бы подумать, что делает:

from Mod1 import var 

такая же, как

import Mod1 
var = Mod1.var # this creates a new variable 

, тогда как я не могу точно объяснить, что я могу сказать, что путем изменения вашего импорта:

import Mod1 

и referr (без глобального сейчас) как

Mod1.var 

Проблема решена.

Mod2.py:

import Mod1 

def foo(newValue): 
    print('foo: %d' % Mod1.var) 
    Mod1.var = newValue 

print('before: %d' % Mod1.var) 
foo(2) 
print('after: %d' % Mod1.var) 

Mod3.py:

import Mod1 
from Mod2 import * 

foo(3) 
print('var: %d' % Mod1.var) 

Выход:

before: 5 
foo: 5 
after: 2 
foo: 2 
var: 3 

Пройдите также через http://www.python.org/dev/peps/pep-0008/; некоторые из вещей, которые он рекомендует:

* avoid wildcard imports (`from <module> import *`) for the various problems they introduce 
* module names should be `lowercase` 

Кроме того, глобальные переменные обычно не считаются хорошим, и всегда есть путь вокруг них; см. Why are global variables evil?.

+1

Нет, это должен быть 'import Mod1; var = Mod1.var' up top .... –

0

Необходимо указать from mod1 import var.

Почему?

Ваш код говорит from mod1 import, но если вы посмотрите на это, вы можете сказать, что это незавершенное заявление. Что вы хотите импортировать? Вы должны указать. Это если вы не хотите делать более простой процесс import mod1, который будет импортировать все.

0

Да, я прочитал статью, подробно излагающую зло миксинов. В моем случае исходный код, содержащий взаимосвязанные функции (без использования класса), был слишком раздутым, и я решил разделить их на 2 модуля (B.py и C.py). Тем не менее, 2 доступа к нескольким одинаковым переменным, поэтому я перечислил эти переменные в A.py. Затем у меня есть D.py, содержащий функции, которые зависят от функций в B.py и C.py. Граф зависимостей, как показано ниже:

 A 
    / \ 
    B  C 
    \ /
     D 

(Bottom полагается на вершине)

У меня нет никаких оснований использовать Примеси, он просто начал с 1, и я думал, что я хотел, чтобы держать их в одно и то же пространство имен даже разделено на четыре модуля.

Как раз сейчас я думал о решении, используя функции getter и setter для каждой переменной. Но я бросил эту идею, потому что это было слишком неуклюжий.

+0

Почему вы смешиваете модули Python? То, что вы скорее всего хотите сделать, это смешивать классы, не так ли? Затем ваши глобальные переменные становятся переменными экземпляра (объекта) или - если это действительно необходимо - переменными класса. И тогда это внезапно может иметь смысл ... – cfi

+0

Кстати, я не вижу, как этот «ответ» является ответом на ваш вопрос. Это не дискуссионный форум. Пожалуйста, прочтите FAQ. Благодарю. – cfi

Смежные вопросы