Python привязка переменной к определенному выражению - PullRequest
2 голосов
/ 18 мая 2010

Я занимаюсь разработкой простого приложения, в котором есть файл Constants.py, содержащий все настройки, вот так

x = y

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

Ответы [ 4 ]

2 голосов
/ 18 мая 2010

В именах переменных Python указываются значения. x=y сообщает Python, что имя переменной x должно указывать на значение, на которое в данный момент указывает y.

Когда вы изменяете y, тогда имя переменной y указывает на новое значение, а имя переменной x все еще указывает на старое значение.

Вы не можете достичь того, чего хотите, с простыми именами переменных.

Мне нравится предложение KennyTM определить x как функцию, поскольку оно явно указывает, что значение x требует запуска некоторого кода (поиск значения y).

Однако, если вы хотите поддерживать единый синтаксис (делая все константы доступными одинаково), вы можете использовать класс со свойствами (атрибуты, которые вызывают функции получения и установки):

Constants.py:

class BunchOConstants(object):
    def __init__(self, **kwds):
        self.__dict__.update(kwds)
    @property
    def x(self):
        return self.y
    @x.setter
    def x(self,val):
        self.y=val
const=BunchOConstants(y=10,z='foo')

Ваш script.py:

import Constants

const=Constants.const
print(const.y)
# 10
print(const.x)
# 10

Здесь вы меняете «постоянную» y:

const.y='bar'

И «константа» х тоже изменяется:

print(const.x)
# bar

Вы также можете изменить x,

const.x='foo'

и y тоже меняются:

print(const.y)
# foo
0 голосов
/ 18 мая 2010

Существует простое решение, которое вы можете сделать. Просто определите свойство и запросите значение fget, которое вы определили.

Например:

a = 7

@property 
def b():
    return a

если вы попросите b, вы получите что-то вроде этого <property object at 0x1150418>, но если вы сделаете b.fget(), вы получите значение 7

Теперь попробуйте это:

a = 9
b.fget()  # this will give you 9. The current value of a

Вам не нужно иметь класс таким способом, иначе, я думаю, он вам понадобится.

0 голосов
/ 18 мая 2010

если ваши значения конфигурации находятся внутри класса, вы можете сделать что-то вроде этого:

>>> class A(object):
...     a = 4
...     @property
...     def b(self):
...         return self.a
... 

затем, каждый раз, когда вы обращаетесь к b, он возвращает значение a.

0 голосов
/ 18 мая 2010

Если вы измените само значение (объект), то все ссылки на него будут обновлены:

>>> a = []
>>> b = a  # b refers to the same object a is refering right now
>>> a.append('foo')
>>> print b
['foo']

Однако, если вы сделаете так, чтобы имя указывало на какой-то другой объект, тогда другие имена будут ссылаться на то, на что они ссылались раньше:

>>> a = 15
>>> print b
['foo']

Вот как работает Python. Имена - это просто ссылки на объекты. Вы можете сделать так, чтобы имя ссылалось на тот же объект, на который ссылается другое имя, но вы не можете сделать так, чтобы имя ссылалось на другое имя. Присвоение имени с помощью оператора = (a = 15) изменяет то, к чему относится a, поэтому оно не может влиять на другие имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...