第一次用户堆栈溢出,我很高兴来到这里。
INTRO:我最近开始了Python编程世界的神奇冒险 - 我喜欢它。现在,在我从C的尴尬过渡中,一切都进展顺利,但是我在创建一个与HEADER文件(.h)同义的东西时遇到了麻烦。
问题:我有中等大小的词典和列表(大约1,000个元素),冗长的枚举和'#defines'(实际上并非如此),但我找不到一种清晰的方式来组织它们。在C中,我会将它们全部放在头文件中,而不再考虑它,但是,在Python中我认为这是不可能的。
CURRENT DIRTY SOLUTION:我正在初始化MODULE或FUNCTION顶部的所有CONSTANT变量(模块,如果有多个函数需要它)。
结论:如果有人想出一种清洁组织常数变量的方法,我将永远感激不尽。
非常感谢你!
答案 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 *
简称为SPAM
或EGGS
。
虽然我们在这里,但请注意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'
优点:
缺点:
有想法吗?
h / t到@hlzr,你们想了解原始的课堂想法