Python:访问变量值时的回调?

时间:2010-10-01 19:17:02

标签: python

假设函数f()返回任意类型的值,可能是一个对象,但甚至可能是intlist等内置类型。有没有办法将变量赋值给该返回值,并且在第一次使用该变量时调用我选择的函数?

我认为这类似于延迟评估,只是对x的引用存在并且可以被后续代码使用。

可能看起来像这样:

x = f() # f is a function, assign variable to return value, but return value is unknown

# do something arbitrary with x
return str(x) # this calls a callback attached to x, which returns the value of x to be used

同样,我想在任何类型上执行此操作,而不仅仅是对象实例。

5 个答案:

答案 0 :(得分:1)

听起来像你想要的属性。

class DeepThought(object):

    @property
    def answer(self):
        print ("Computing the Ultimate Answer to the Ultimate Question"
                   " of Life, The Universe, and Everything ")
        return 42

print DeepThought().answer

你可以在课堂上

答案 1 :(得分:1)

如果你想为它编写一个C扩展名,你可以将这个值包装成一个行为与Python的weakref.ProxyType相同的行为,只有懒惰而不是“弱”。您可以随时查看Python源代码,看看它是如何完成的,但有些东西告诉我它非常重要。

Python中的weakref代理类型的实现是here

答案 2 :(得分:1)

鉴于您的约束,唯一可行的解​​决方案是分叉Python并修改其对变量查找的内部处理。您可能还需要修改字节码定义。为性能打击做好准备。

或写一个PEP并非常非常耐心。你的选择。

答案 3 :(得分:1)

在Python中有几种穷人懒惰评估的实现,例如lazypy

当然,CPython中没有真正的延迟评估,但使用thunk对象空间在PyPy中可以使用

答案 4 :(得分:0)

在这种特殊情况下,您可以在f()的返回类型上重载__str__方法。例如。

def f():
    class _f:
      def __str__(self):
        return "something"
    return _f()