Python面向切面编程(装饰器)

今天写python装饰器的时候,并没有像想象中的那么顺手。原因还是对于装饰器的写法没有完全掌握,好多小细节没有了解清楚。

现在把自己写的代码片段贴出来分析一下

import threading
import os
from utils import fileutil
import logging
from functools import wraps
CONFIG_PATH = '/etc/massclouds/mcstudent.conf'
config_mutex = threading.Lock()
def config(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        config_mutex.acquire()
        try:
            if not os.path.exists(CONFIG_PATH):
                fileutil.create_file(CONFIG_PATH)
            return func(*args, **kwargs)
        except Exception as e:
            logging.exception(e)
            raise Exception(e)
        finally:
            config_mutex.release()
    return wrapper
@config
def get_value(section, option):
    value = ''
    parser = ConfigParser.ConfigParser()
    parser.read(CONFIG_PATH)
    if parser.has_section(section):
        if parser.has_option(section, option):
            value = parser.get(section, option)
    return value

首先,要注意的就是如果被装饰的函数有参数的话,装饰器中的wrapper函数的形参最好就是*args, **kwargs,一了百了。

其次,装饰器需要返回一个函数,即 return wrapper,而不是return wrapper()。

另外,还有一点需要注意的是,如果有锁操作,一定要确定锁的执行是成对出现的。

No comments yet.

Leave a comment

Comment form

All fields marked (*) are required

返回顶部
跳到底部