前言:
Python到现在也没出来个const方法,当然我们可以使用别的方法来实现。 比如,可以使用enum来定义const… 对的,python社区里不少人这么干的,居然在邮件列表里得到不少人的认同…
const 有什么好处? 最直接的好处是,防止被二次修改… 上次有个cdn刷新后端项目,直接使用config.py 做配置文件,因为有逻辑冲突串改了变量,导致服务没有限频限内存,导致服务crash… 当然,首先承认这是我编码的问题… 但如果变量一开始就是不可更改的常量,我是不是早就发现该问题了。
该文章后续会有更新, 原文地址 http://xiaorui.cc/?p=4866
实现:
第一种方法, 使用enum来定义变量,防止串改.
from enum import Enum, unique class Xiaorui(Enum): a = 0 b = 5 c = 10 Xiaorui.a.value Xiaorui.b.value
第二种方法,自己实现一个const类.
文件名: const.py
#coding:utf-8 import sys class Const: def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): orig = super(Const, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance class ConstError(TypeError): def __init__(self, name): self.msg = "Can't rebind const instance attribute (%s)"%name def __str__(self): return 'error msg: {}'.format(self.msg) def __repr__(self): return self.__str__() def __setattr__(self, name, value): if self.__dict__.has_key(name): raise self.ConstError(name) self.__dict__[name] = value def __delattr__(self, name): if self.__dict__.has_key(name): raise self.ConstError(name) raise self.ConstError(name) sys.modules[__name__] = Const()
测试下错误:
import const const.aa = 123 const.aa = 456
错误的输出:
Traceback (most recent call last): File "test.py", line 4, in <module> const.aa = 456 File "/Users/ruifengyun/github/pyconsts/const.py", line 19, in __setattr__ raise self.ConstError(name) const.ConstError: error msg: Can't rebind const instance attribute (aa)
实现原理很简单,使用python类的魔法函数来定义setattr及delattr,出现重复就排除异常… 完整代码放在github里了, https://github.com/rfyiamcool/func_instance/tree/master/const
END.