试着用 context manager 实作
class ContextBase(object):
"""The base of the context manager."""
def __init__(self, name):
self.name = name
def __enter__(self):
if not self.Initialize():
self.Release()
raise Exception('Initialize %s failed' % self.name)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
self.Release()
return False
def Initialize(self):
raise NotImplementedError
def Release(self):
raise NotImplementedError
使用上只要继承ContextBase再实作Initialize和Release Method,
接着再用with context1, context2, ...:即可
完整版: https://gist.github.com/anonymous/18f0d078aa87bea34eadbb69a2d175e7
输出:
Initialize 1: True
Initialize 2: False
Release 2
Release 1
result: False
※ 引述《henry8168 (番薯猴)》之铭言:
: 大家好。
: 很多人都说 if else 已经很够用了,不需要 switch,
: 但 C 语言的 switch 有一个特点就是,如果每个 case 不加上 break,
: 就能够继续执行下方其他 case 的行为。
: 尤其写 kernel module 的人,
: 应该常常会需要在 initial 阶段控管初始化失败时的状况。
: 打个比方,很多开发者都会很喜欢用 goto。
: int init_phase(){
: char* errfunc = "functionNameHere";
: if(init_process1() < 0){
: errfunc = "init_process1";
: goto fail_p1;
: }
: if(init_process2() < 0){
: errfunc = "init_process2";
: goto fail_p2;
: }
: if(init_process3() < 0){
: errfunc = "init_process3";
: goto fail_p3;
: }
: return 0;
: init_process3:
: release_process2();
: init_process2:
: release_process1();
: init_process1:
: printf("%s: initial failed.\n",errfunc);
: return -1;
: }
: 但不爱用 goto 的我就会改成以下:
: int init_phase(){
: char* errfunc = "functionNameHere";
: int errOccur = 0;
: if(!errOccur){
: if(init_process1() < 0){
: errfunc = "init_process1";
: errOccur = 1;
: }
: }
: if(!errOccur){
: if(init_process2() < 0){
: errfunc = "init_process2";
: errOccur = 1;
: }
: }
: if(!errOccur){
: if(init_process3() < 0){
: errfunc = "init_process3";
: errOccur = 1;
: }
: }
: if(!errOccur)
: return 0;
: switch(errfunc){
: case "init_process3":
: release_process2();
: case "init_process2":
: release_process1();
: case "init_process1":
: printf("%s: initial failed.\n",errfunc);
: }
: return -1;
: }
: 抱歉,在 Python 板打这么多 C 语言 @@"
: 不过我想表达的就如同上述,请问 Python 该怎么做到类似的功能呢?
: 我正在改一位同仁的 Python,想运用类似 switch 的特点完成。
: 查到很多人都说可以用 dict,却还是一头雾水。
: 谢谢。