如果您想弄乱嵌套常量并且不喜欢 dicts,我想出了这个有趣的解决方案:
# 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'
优点:
- 处理嵌套的字典
- 可能会生成其他类型的字典/类
- namedtuples 为常量提供不变性
缺点:
- 如果您的 klass 上未提供 .keys 和 .values ,则可能无法响应(尽管您有时可以使用 ._fields 和 list(ABC) 进行模仿)
想法?
h/t 致 @hlzr 和你们的原创课程理念