Как реализовать эквивалент Python functools.wraps в Go?
Я знаю, что могу обернуть функции в Go через функцию возврата, ошибка, как реализовать эквивалент Python functools.wraps в Go? Как прикрепить атрибут к функциям в 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
Я хочу использовать упакованную функцию в качестве ключа во время выполнения. Поэтому я хочу оставить имя функции без изменений после переноса. Как реализовать работу, которая d_wraps
делает в го?
1 ответ
Как прикрепить атрибут к функциям в Go?
Нет, вы не можете прикрепить атрибут к функциям в 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")
}
Если у вас много функций с одинаковой логикой переноса, вы можете передать функцию 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")
}
}