python中的常量?

时间:2009-11-29 23:32:26

标签: python

我在很多函数中声明了以下变量,因为我需要在每个函数中使用这些值。无论如何我可以在全球范围内声明它们,例如我不必在我的所有方法中声明它们吗?我在我的一类实例方法中使用了所有这些方法。

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 个答案:

答案 0 :(得分:12)

如果它们都在一个模块中,那么它们只存在于该模块的命名空间中,您不必担心名称冲突。 (你仍然可以将它们导入其他的名称空间)

例如

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

答案 1 :(得分:5)

除了单独的模块技巧,如果我想要它们在同一个模块中,我会经常把它们放在一个类like this中:

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

答案 2 :(得分:1)

您可以简单地在模块级别(即.py源文件的顶级)声明这些变量,并且不需要使用self或类似的东西。在这种情况下,我认为惯例是给他们大写的名字。

顺便说一句,我不禁要指出你可以像这样宣布他们:

x, y, t = 0, 1, 2

答案 3 :(得分:1)

如果这些“变量”是真正的常量,则在模块级别声明它们似乎是合乎逻辑的。如果你必须在函数内修改它们,你只需要在该函数中声明它们是全局的。

答案 4 :(得分:0)

您是否考虑过

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

答案 5 :(得分:-1)

import __builtin__
__builtin__.__dict__["X"] = 5

这将在执行的所有模块中存储X常量,直到解释器退出。

请记住,要小心使用它,因为其他python开发人员不太可能期望这样。 我主要用它来存储翻译函数'_'。