2009-11-13 43 views
1

我想做到這一點:以編程方式確定函數的評估是否正在分配?

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!' 

我猜測它歸結爲circumstanses是什麼時,返回的對象的__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!' 

回答

3

我對你的問題很困惑,但我認爲你正在試圖做的是運行一個函數,當值重新分配。

而不是用__del__()方法函數做一些棘手的事情,我建議你把你的值放入一個類實例,然後重載__setattr__()。你也可以重載__delattr__(),以確保你趕上del(object.x)爲你的價值x

__setattr__()的根本目的是給你一個鉤子的東西時,分配給你的類的成員趕上。你不需要任何奇怪的end_of_program標誌。在你的程序結束後,剛剛擺脫你的重載函數爲__delattr__()所以它不會呼籲程序結束,清理工作。

1

函數不能告訴其返回值的用途。您的解決方案將打印噗如果重新分配給bar例如。

什麼是你正在試圖解決的實際問題?

+0

是的,我必須避免重新分配'bar'直到將'at_end_of_program'標誌設置爲True。我試圖有時傳遞,有時關閉一個由函數創建的COM對象,具體取決於它是否被請求或被函數的調用所請求。收集垃圾時,COM對象不會關閉。 – Paul 2009-11-13 03:54:57

相關問題