以编程方式确定是否正在分配功能评估?

时间:2009-11-13 01:58:57

标签: python

我想这样做:

def foo():
    if <a magical condition>:
        return x
    else:
        poof()

# or...
def foo():
    x = <a magical object>
    return x

def poof():
    print 'poof!'

bar = foo()  # bar points to <a magical object> but poof() is not called

foo() # prints 'poof!'

我想这可以归结为调用返回对象的__del__方法时的情况。但也许有更好的方法。就像函数本身知道它的返回值被分配一样。我想我担心依赖垃圾收集的时间。我也不喜欢那个全球at_end_of_program旗帜。

我的解决方案:

class Magic:
    def __del__(s):
        poof()

def foo():
    x = Magic()
    return x

def poof():
    if not at_end_of_program:
        print 'poof!'

bar = foo()  # No poof.

foo() # prints 'poof!'

2 个答案:

答案 0 :(得分:3)

我对你的问题感到很困惑,但我认为你要做的是在重新分配值时运行一个函数。

我没有使用__del__()方法函数做一些棘手的事情,我建议你把你的值放到一个类实例中,然后重载__setattr__()。您还可以重载__delattr__()以确保抓取del(object.x)的值x

__setattr__()的目的是为你提供一个钩子来捕捉什么东西分配给你的班级成员。而且你不需要任何奇怪的end_of_program标志。在程序结束时,只需删除__delattr__()的重载函数,这样就不会调用它来进行程序结束清理。

答案 1 :(得分:1)

函数无法判断其返回值的用途。如果您重新分配到bar,您的解决方案将会打印出来。

你想解决的真正问题是什么?