#file: wplan.py
#get the obj's available public apis
def getCmdsAllowd(obj):
    import re
    CFLAG = re.compile('^[a-z]')

    cmdsAllowd = []
    for attr in vars(obj).values():
        if hasattr(attr,'func_name') and re.match(CFLAG,attr.func_name): cmdsAllowd.append(attr.func_name)

    return cmdsAllowd

class WPlanBase:
    def __getitem__(self, key):
        if hasattr(self, key):
            if hasattr(self, '_param'):
                return apply(eval('self.%s' % key), self._param[key])
            else:
                return (eval('self.%s' % key))()
        else:
            error = "%s didn't has the '%s' method, available mehthods: %s" %  \
                    (self.__class__, key, getCmdsAllowd(self.__class__))
            raise Exception, error

# parameters Class
class WPlanParam(WPlanBase):
    def __init__(self, obj, paramsMap={}):
        self._obj = obj
        self._map = paramsMap
        obj._param = self

    def update(self, paramsMap): self._map.update(paramsMap)

    def __setitem__(self, key, val): self._map.update({key: val})

    def __getitem__(self, funcName):
        coO, map = eval("self._obj.%s" % funcName).func_code, self._map
        return tuple([map.has_key(item) and map[item] or '' for item in coO.co_varnames[1:coO.co_argcount]])

将函数调用方式变为属性调用,便于业务模型的构建

比如你可以用sample['odata']['valideData']['kdata']来代替对应的3个函数调用, 可用于程序流程的设计 Sample file

# -*- coding: utf-8; -*-
import wplan
class Sample(wplan.WPlanBase):
    def __init__(self):
        pass

    def methodWithoutArg(self):
        print 'This is a sample'

    def methodWithOneArg(self, argOne):
        print 'Got arg: '+argOne

if __name__ == '__main__':
    sample = Sample()
    param = wplan.WPlanParam(sample, {'argOne': 'OK'})
    sample['methodWithoutArg']
    sample['methodWithOneArg']
    print param['methodWithOneArg']

    param['argOne'] = 'OK Changed'
    sample['methodWithOneArg']

    sample['with']