In [1]: def test(array, func):
...: midres = [x**2 for x in array]
...: return func(midres)
...:
In [2]: test([1,2,3], sum)
Out[2]: 14
In [3]: p = test([2,3], sum)
是否有可能获得midres
的值p
获得[4,9]
的值(在这种情况下为test
),但不更改p.midres
函数?当然,midres
不起作用;但有没有办法在退货声明中不包含midres
来获取它?
我见过this question here但是它并没有真正回答我的问题,因为如果可能的话,我想通过p
到{{1}}。
提前致谢。
答案 0 :(得分:0)
除了计算的任何内容之外,您还可以检测函数func
以返回其参数:
def my_sum(x):
return sum(x), x
p, midres = test([2,3], my_sum)
#13
#[4, 9]
答案 1 :(得分:0)
您可以简单地装饰您的测试功能,因此您无需更改任何测试。并按照您的意愿准确获取p.medris
之类的属性。
def make_wrapper(func):
def wrapped(array, f):
def with_attribute():
return func(array, f)
with_attribute.midres = func(array, lambda x:x)
return with_attribute
return wrapped
@make_wrapper
def test(array, func):
midres = [x**2 for x in array]
return func(midres)
p=test([1,2,3],sum)
# if you want only the value
print(p()) # --> 14
# if you want midres attribute
print(p.midres) # --> [1, 4, 9]
如果你想让它看起来更均匀一点。您可以创建另一个名为的属性,例如value。然后,您不必运行函数p()
来获取其值。
def make_wrapper_value(func):
def wrapped(array, f):
def with_attribute():
pass
with_attribute.value = func(array, f)
with_attribute.midres = func(array, lambda x:x)
return with_attribute
return wrapped
@make_wrapper_value
def test(array, func):
midres = [x**2 for x in array]
return func(midres)
p=test([1,2,3],sum)
print(p.value) # --> 14
print(p.midres) # --> [1, 4, 9]