gpt4 book ai didi

python-2.7 - 将模块中的所有函数包装在包装器中

转载 作者:行者123 更新时间:2023-12-02 04:38:30 27 4
gpt4 key购买 nike

我有一个模块mymod,它定义了十几个具有相同签名的函数

def myfun1 (a,b,c):
...
return d

我想像这样跟踪所有这些函数:

def traced (f):
def wrapped (a,b,c):
print ">>>%s(%d)" % (f.__name__, (a+b)/c)
d = f(a,b,c)
print "<<<%s(%g)" % (f.__name__, 1/d)
return d
return wrap

@traced
def myfun1 (a,b,c):
...
return d

(这里的 (a+b)/c1/d 是更复杂的东西的替代品)。

除了在函数定义之前添加 @traced 之外,是否有更优雅的方法来实现这一点?

附言。 similar question 5年前被问到。不知道有没有新的答案。

最佳答案

通过浏览 globals() 字典,可以:

def myfun1 (a,b,c):
return 1.+a+b+c

def myfun2 (a,b,c):
return 1.+a+b-c

def traced (f):
def wrapped (a,b,c):
print ">>>%s(%d)" % (f.__name__, (a+b)/c)
d = f(a,b,c)
print "<<<%s(%g)" % (f.__name__, 1/d)
return d
return wrapped

print 'myfun1(1,2,3): ', myfun1(1,2,3)
print 'myfun2(1,2,3): ', myfun2(1,2,3)

import types
for x in globals().copy(): # copy() is mandatory because globals() is being updated
if x == 'traced' or x.startswith('__'): # Ignore trace function and private ones
continue
if isinstance(globals()[x], types.FunctionType):
print "Found function:", x
globals()[x] = traced(globals()[x])


print 'myfun1(1,2,3): ', myfun1(1,2,3)
print 'myfun2(1,2,3): ', myfun2(1,2,3)

结果:

myfun1(1,2,3):  7.0
myfun2(1,2,3): 1.0
Found function: myfun1
Found function: myfun2
myfun1(1,2,3): >>>myfun1(1)
<<<myfun1(0.142857)
7.0
myfun2(1,2,3): >>>myfun2(1)
<<<myfun2(1)
1.0

关于python-2.7 - 将模块中的所有函数包装在包装器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39726573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com