Константы в питоне? - PullRequest
3 голосов
/ 30 ноября 2009

У меня есть следующие переменные, объявленные во многих функциях, так как мне нужны эти значения в каждой из них. Могу ли я в любом случае объявить их в глобальном масштабе или что-то подобное, например, мне не придется объявлять их во всех моих методах? Я использую все эти методы на методах экземпляра моего класса.

x = 0
y = 1
t = 2

В c # я бы просто объявил их как глобальные переменные класса, но проблема в том, что я не хочу использовать их всегда как self.x, self.y и self.z, так как он получает мой алгоритм код ужаснее, чем он есть. Как бы вы это сделали?

Типичное использование этого будет:

def _GetStateFromAction(self, state, action):
    x = 0
    y = 1
    t = 2

    if (action == 0):
        return (state[x], state[y] - 1, state[t])

    if (action == 1):
        return (state[x] - 1, state[y], state[t])

Ответы [ 6 ]

12 голосов
/ 30 ноября 2009

Если все они находятся в одном модуле, то они живут только в пространстве имен этого модуля, и вам не нужно беспокоиться о столкновении имен. (И вы все еще можете импортировать их в другие пространства имен)

Например

MyModWithContstants.py

x = 0
y = 0

def someFunc():
  dosomethingwithconstants(x,y)

и мы также можем сделать

anotherMod.py

from MyModWithConstants import x
# and also we can do
import MyModWithConstants as MMWC

def somOtherFunc():
  dosomethingNew(x, MMWC.y)  
  ## x and MMWC.y both refer to things in the other file
5 голосов
/ 30 ноября 2009

В дополнение к отдельной уловке модуля, если я хочу, чтобы они были в том же модуле, я часто помещал их в класс, как этот :

class PathConstants(object):
    CSIDL_DESKTOP = 0
    CSIDL_PROGRAMS = 2

def get_desktop():
    return _get_path_buf(PathConstants.CSIDL_DESKTOP)

Если вы хотите сделать их более постоянными, то вы можете сделать setattr throw:

class ConstantExeption(Exception):
    pass

class ProgramConstants(object):
    foo = 10
    bar = 13
    def __setattr__(self, key, val):
        raise ConstantExeption("Cannot change value of %s" % key)

# got to use an instance...
constants = ProgramConstants()
print constants.foo
constants.bar = "spam"

След:

10
Traceback (most recent call last):
  File "...", line 14, in <module>
    constants.bar = "spam"
  File "...", line 9, in __setattr__
    raise ConstantExeption("Cannot change value of %s" % key)
__main__.ConstantExeption: Cannot change value of bar
1 голос
/ 30 ноября 2009

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

1 голос
/ 30 ноября 2009

Вы можете просто объявить эти переменные на уровне модуля (то есть на верхнем уровне исходного файла .py), и вам не нужно будет использовать self или что-то подобное. В этом случае я думаю, что условием было бы дать им имена в верхнем регистре.

Кстати, я не могу не отметить, что вы могли бы объявить их так:

x, y, t = 0, 1, 2
0 голосов
/ 30 ноября 2009
import __builtin__
__builtin__.__dict__["X"] = 5

Это сохранит постоянную X во всех модулях, выполняемых до выхода из интерпретатора.

Не забывайте использовать его с осторожностью, так как другие разработчики Python вряд ли ожидают этого. Я использую его в основном для хранения функции перевода '_'.

0 голосов
/ 30 ноября 2009

Рассматривали ли вы

global x, y, z
x=0
y=1
z=2

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