如何实现等效的Python functools.wraps?

时间:2018-08-12 00:38:54

标签: go functional-programming

我知道我可以通过返回函数将函数包装在Go中,如何在Go中实现等效于Python functools.wraps的bug?如何在Go函数中附加属性?像下面的Python代码一样。

from functools import wraps

def d(f):
    def wrapper(*args):
        f(*args)

    return wrapper

def d_wraps(f):
    @wraps(f)
    def wrapper(*args):
        f(*args)

    return wrapper

@d
def f(a=''):
    print a

@d_wraps
def g(a=''):
    print a

if __name__ == '__main__':
    print 'function name: ', f.__name__
    f('abc')

    print 'function name: ', g.__name__
    g('abc')

d不会更改功能名称,d_wraps不会更改功能名称。结果是

function name:  wrapper
abc
function name:  g
abc

我想在运行时将包装的函数用作键。所以我想在包装后保持函数名称不变。如何在Go中实施d_wraps做的工作?

1 个答案:

答案 0 :(得分:1)

  

如何在Go中的函数上附加属性?

否,您不能将属性附加到Go中的函数中。

  

如何在Go中执行d_wraps做的工作?

您可以实现另一个函数来调用您的函数,并以新名称调用该函数。

package main

import "fmt"

func main() {
   g_warp("abc")
}

func g(a string){
   fmt.Println(a);
}

func g_warp(a string){
   g(a+"_mysuffix");
}

如果要更改函数内容但使用相同的函数名称,则可以使用全局函数变量:

package main

import (
    "fmt"
)

func main() {
    g = gV2
    g("hello")
}

var g = gV1;

func gV1(a string){
    fmt.Println(a)
}
func gV2(a string){
    gV1(a+"_suffix")
}

如果您有很多具有相同换行逻辑的函数,则可以传入origin函数并返回新函数:

package main

import (
    "fmt"
)

func main() {
    g = wrap(g)
    g("hello")
    f = wrap(f)
    f("hello")
}

var g = gV1;

func gV1(a string){
    fmt.Println(a)
}
var f = fV1;

func fV1(a string){
    fmt.Println(a+" "+a)
}
func wrap(originFn func(a string)) func(a string){
    return func(a string){
         originFn(a+"_suffix")
    }
}