访问函数外部的局部变量 - python

时间:2018-02-05 21:50:56

标签: python function local-variables

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}}。

提前致谢。

2 个答案:

答案 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]