Python - 定义常量列表或词典的最佳/最干净的方法

时间:2012-06-20 01:21:03

标签: python c header constants organized

第一次用户堆栈溢出,我很高兴来到这里。

INTRO:我最近开始了Python编程世界的神奇冒险 - 我喜欢它。现在,在我从C的尴尬过渡中,一切都进展顺利,但是我在创建一个与HEADER文件(.h)同义的东西时遇到了麻烦。

问题:我有中等大小的词典和列表(大约1,000个元素),冗长的枚举和'#defines'(实际上并非如此),但我找不到一种清晰的方式来组织它们。在C中,我会将它们全部放在头文件中,而不再考虑它,但是,在Python中我认为这是不可能的。

CURRENT DIRTY SOLUTION:我正在初始化MODULE或FUNCTION顶部的所有CONSTANT变量(模块,如果有多个函数需要它)。

结论:如果有人想出一种清洁组织常数变量的方法,我将永远感激不尽。

非常感谢你!

4 个答案:

答案 0 :(得分:21)

将常量放入自己的模块中:

# constants.py

RED = 1
BLUE = 2
GREEN = 3

然后导入该模块并使用常量:

import constants

print "RED is", constants.RED

常量可以是你喜欢的任何值,我在这里显示整数,但列表和dicts也可以正常工作。

答案 1 :(得分:9)

通常我会这样做:

文件: constants.py

CONSTANT1 = 'asd'
CONSTANT_FOO = 123
CONSTANT_BAR = [1, 2, 5]

文件: your_script.py

from constants import CONSTANT1, CONSTANT_FOO
# or if you want *all* of them
# from constants import *

...

现在你的常量在一个文件中,你可以很好地导入和使用它们。

答案 2 :(得分:3)

创建一个单独的文件constants.py,并将所有与全局相关的常量放在那里。然后,您可以import constants将其称为constants.SPAM或将(可疑的)from constants import *简称为SPAMEGGS

虽然我们在这里,但请注意Python不支持常量常量。惯例只是在ALL_CAPS中命名它们并保证不会改变它们。

答案 3 :(得分:0)

如果您想弄乱嵌套常量并且不喜欢字典,我想出了一个有趣的解决方案:

# Recursively transform a dict to instances of the desired class

import json
from collections import namedtuple

class DictTransformer():
    @classmethod
    def constantize(self, d):
        return self.transform(d, klass=namedtuple, klassname='namedtuple')

    @classmethod
    def transform(self, d, klass, klassname):
        return self._from_json(self._to_json(d), klass=klass, klassname=klassname)

    @classmethod
    def _to_json(self, d, access_method='__dict__'):
        return json.dumps(d, default=lambda o: getattr(o, access_method, str(o)))

    @classmethod
    def _from_json(self, jsonstr, klass, klassname):
        return json.loads(jsonstr, object_hook=lambda d: klass(klassname, d.keys())(*d.values()))

例如:

constants = {
  'A': {
    'B': {
      'C': 'D'
    }
  }
}
CONSTANTS = DictTransformer.transform(d, klass=namedtuple, klassname='namedtuple')
CONSTANTS.A.B.C == 'D'

优点:

  • 处理嵌套的字典
  • 可能会生成其他类型的字典/类
  • 命名元组为常数提供不变性

缺点:

  • 如果您的键盘上未提供.key和.value,则它们可能不会响应(尽管有时您可以模仿._fields和list(A.B.C))

有想法吗?

h / t到@hlzr,你们想了解原始的课堂想法