2016-02-25 2 views
0

Допустим, у меня есть следующий конфигурационный файл:Python динамический импорт и изменение переменной

config.py:

x = 2 
y = x * 2 

Я хотел бы импортировать этот файл в main.py , предпочтительно используя команду load_source, но я также хочу иметь возможность изменять значение x во время импорта, так что изменение в x распространяется на другие переменные в файле config.py. Например, я хочу, следующий код, печатает 6, а не 4.

main.py:

import imp 
config = imp.load_source('', 'config.py') 
config.x = 3 
print config.y 

Что такое лучший способ сделать это? Я знаю, что я могу писать функции в config.py, чтобы сделать это для меня, но я предпочитаю, чтобы конфиг был простым определением переменных.

+0

Почему не просто импортировать конфигурации и манипулировать переменной, как это. В любом случае они глобальны –

+0

Даже если вы импортируете его, значение y не изменится при изменении x, потому что оно определено после x, а изменение x не изменит y, если оно не определено как список или что-то – Amin

+0

Это не так, как это работает. Python использует динамическое кастинг, когда вы говорите y = x * 2, который не является указателем. Значение даже в скрипте, где y был определен, если вы печатаете (y), тогда установите x = 1 и print (y) снова y будет одинаковым. вы можете сделать y функцией или создать класс внутри config, например, предложенный brent. –

ответ

1

Поместите код в класс:

class Config(object): 
    def __init__(self, x=2): 
     self.x = x 
     self.y = x * 2 

Затем в основной программе:

c = Config(3) 
print c.y 
+0

Я надеялся, что смогу уйти без определения класса или функций, но да, это работает, спасибо. – Amin