假设函数f()返回任意类型的值,可能是一个对象,但甚至可能是int
或list
等内置类型。有没有办法将变量赋值给该返回值,并且在第一次使用该变量时调用我选择的函数?
我认为这类似于延迟评估,只是对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
同样,我想在任何类型上执行此操作,而不仅仅是对象实例。
答案 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)
答案 4 :(得分:0)
在这种特殊情况下,您可以在f()的返回类型上重载__str__
方法。例如。
def f():
class _f:
def __str__(self):
return "something"
return _f()