登录
首页 >  Golang >  Go问答

如何创建Python 签名保留的函数包装器?

来源:stackoverflow

时间:2024-03-24 22:39:52 431浏览 收藏

在 Python 中,使用 `functools.wraps` 装饰器可以保持函数包装器在运行时的名称不变,便于在使用包装器作为键时保持函数的原始名称。然而,在 Go 语言中,无法直接将属性附加到函数。

问题内容

我知道我可以通过返回函数在 go 中包装函数,bug 如何在 go 中实现等效的 python functools.wraps ?如何将属性附加到 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 的工作?


解决方案


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

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

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")
}

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

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")
    }
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>