python在单独的文件中初始化常量

时间:2012-10-31 11:52:21

标签: python class import constants

我有一个问题类似于此处提出的问题:Importing a long list of constants to a Python file

基本上,我有一个单独的模块,它只包含很长的常量列表,例如

constants.py

x = 1.2
y = 30.4
.
.
.

在另一个模块中,我想导入这些常量并将它们初始化为实例属性。

class.py

class something(object):
    def __init__(self):
        import constants
        self.x = constants.x
        self.y = constants.y
        .
        .
        .

是否有更简单或更pythonic的方式来执行此操作而不是重新输入所有变量名称?

5 个答案:

答案 0 :(得分:1)

你可以做到

for constant, value in constants.__dict__.values():
  setattr(self, constant, value)

为什么需要它们作为实例属性?

答案 1 :(得分:1)

您可以将常量放在模块中的类中。这个类可以更容易传递,或者用作任何需要这些常量作为类属性的类的mixin类。

class Constants(object):
    x = 1.2
    y = 30.4


# optional 
class Base(object):
    pass

class Something(Constants, Base):
    pass


s = Something()

print(s.x)

然而,由于它只是数据,我可能只是使用某种类型的数据结构(如字典)来保存它们。我不确定为什么你需要将它们作为类属性,当任何代码只能从模块中引用它们时。

答案 2 :(得分:1)

总有类似的东西:

class something(object):
    def __init__(self):
        import constants
        for name in ['x', 'y', ...]:
            setattr(self, name, getattr(constants, name))

这样做的好处是可以避免多次代表self.X = constants.X,并且意味着您只在一个地方列出名称。

可以使用它:

for name, value in constants.__dict__.iteritems():
    setattr(self, name, value)

要获取constants中绑定的所有名称而不明确列出它们,但我个人不会。它使something对象实际拥有的属性变得更加清晰,而且非常很容易让Python模块最终包含比你意识到的更多的名字。例如,如果您在定义所有常量的过程中必须在math中导入另一个模块(例如,constants),那么您最终会得到意外的math属性您的所有something个实例。

我认为明确列出您要导入的名称更清晰。另外,如果您发现需要为程序的其他部分添加更多常量(并且常量只能与{{1相关),则意味着您不会影响所有something实例。那么它们确实应该列在something中,而不是在外部模块中。

答案 3 :(得分:1)

Python开发人员开发了一个很酷的解决方案:它被称为ConfigParser

一个实际例子:config.ini

[constants]
key = value
x = 0
y = 1

class.py

from ConfigParser import SafeConfigParser
class MyClass(object):
    def __init__(self, **kwargs):
        self.config = SafeConfigParser(defaults=kwargs).read('config.ini')

    def get_x(self):
        return self.config.get('constants', 'x')

我希望这会有所帮助。

编辑:如果您需要实例属性,可以执行以下操作:

class MyClass(object):
    ...
    def __getattr__(self, key):
        return self.config.get('constants', key)

EDIT2:需要一个Python文件,而.ini文件不是解决方案吗?

from . import config
class Myclass(object):
    def __getattr__(self, key):
        return getattr(config, key)

答案 4 :(得分:0)

from constants import x, y请确保您以后不小心过度使用变量(即不要使用通用名称)