今天闲来无事翻看编写高质量代码--改善Python程序的91个建议,其中有一篇将常量集中在一个文件的建议。
正好这一段时间做的工作需要用上这部分内容,因此做一下整理和扩充。
原书作者使用的应该是python2*,在本机python3.5的环境下并不适用,因此略作改造,代码如下:
class _const:
class ConstError(TypeError):
pass
class ConstCaseError(ConstError):
pass
def __setattr__(self, name, value):
if name in self.__dict__:
raise self.ConstError(
"Can't change const.%s, No Existsing Key!" % name)
if not name.isupper():
raise self.ConstCaseError(
'const name "%s" if not all uppercase' % name)
self.__dict__[name] = value
def __getitem__(self, key):
if name in self.__dict__:
return self.__dict__[key]
else:
raise self.ConstError(
"Can't return const.%s, No Existsing Key!" % key)
添加getitem的原因是为了像字典一样获取常量。
const = _const()
const.PI = 3.14159265
print(const.PI)
print(const['PI'])
# 上面两种打印结果完全一致