2017-05-08 76 views
0

我要撰写关于喜欢什么参数给定函数获取给定的信息等等。我想这样做的例子是装饰:保持状态

@author("Joey") 
@parameter("name", type=str) 
@parameter("id", type=int) 
@returns("Employee", desc="Returns employee with given details", type="Employee") 
def get_employee(name, id): 
    // 
    // Some logic to return employee 
    // 

骷髅装饰的可能如下:

json = {} 
def author(author): 
    def wrapper(func): 
     def internal(*args, **kwargs): 
       json["author"] = name 
       func(args, kwargs) 
     return internal 
    return wrapepr 

类似地,参数装饰可以写成如下:

def parameter(name, type=None): 
    def wrapper(func): 
     def internal(*args, **kwargs): 
       para = {} 
       para["name"] = name 
       para["type"] = type 
       json["parameters"].append = para 
       func(args, kwargs) 
     return internal 
    return wrapepr 

同样,可以编写其他处理程序。最后,我可以调用一个函数来为每个函数获取所有形成的JSON。

末输出可以

[ 
{fun_name, "get_employee", author: "Joey", parameters : [{para_name : Name, type: str}, ... ], returns: {type: Employee, desc: "..."} 
{fun_name, "search_employee", author: "Bob", parameters : [{para_name : age, type: int}, ... ], returns: {type: Employee, desc: "..."} 
... 
} 
] 

我不知道我怎么能保持状态,并了解巩固有关一个功能应一起处理数据。

我该如何做到这一点?

回答

0

我不知道如果我完全得到你的使用情况,但不会是工作,笔者添加到您当前的功能:

func_list = [] 

def func(var): 
    return var 

json = {} 
json['author'] = 'JohanL' 
json['func'] = func.func_name 
func.json = json 

func_list.append(func.json) 

def func2(var): 
    return var 

json = {} 
json['author'] = 'Ganesh' 
func2.json = json 

func_list.append(func2.json) 

这可以使用装饰如下自动化:

def author(author): 
    json = {} 
    def author_decorator(func): 
     json['func'] = func.func_name 
     json['author'] = author 
     func.json = json 
     return func 
    return author_decorator 

def append(func_list): 
    def append_decorator(func): 
     func_list.append(func.json) 
     return func 
    return append_decorator 

func_list = [] 

@append(func_list) 
@author('JohanL') 
def func(var): 
    return var 

@append(func_list) 
@author('Ganesh') 
def func2(var): 
    return var 

然后你就可以访问json字典为func.jsonfunc2.json或发现在func_list的功能。请注意,为了装饰者的工作,你必须添加他们的顺序,我已经把他们,我没有添加任何错误处理。

而且,如果你喜欢func_list不明确的被传递,而是使用一个globaly定义的列表中有一个明确的名称,代码可以稍微简化为:

func_list = [] 

def author(author): 
    json = {} 
    def author_decorator(func): 
     json['func'] = func.func_name 
     json['author'] = author 
     func.json = json 
     return func 
    return author_decorator 

def append(func): 
    global func_list 
    func_list.append(func.json) 
    return func 

@append 
@author('JohanL') 
def func(var): 
    return var 

@append 
@author('Ganesh') 
def func2(var): 
    return var 

也许这是足以让你?

+0

当作者'Ganesh'有另一个'func2'时会出现问题。我们需要创建输出'[{func:'func',作者:'JohanL'},{func:'func2',作者:'Ganesh。}}]' 该方法是否适用于第二个函数? –

+0

这将适用于我的更新示例中显示的两个函数。每个人都会有一个独特的json字典。 – JohanL

+0

感谢您的解释@JohanL。 是的。这两个JSON是按照JSON生成的。但最终的输出是所有这样的JSON的列表。为此,我们需要创建另一个装饰器,对吧?那个装饰器需要在第一个装饰器之后才被调用? –