簡體   English   中英

Python weakref函數返回值

[英]Python weakref on function return values

是否可以從函數返回值創建weakref,如果是這樣的話?

  1. 你從函數本身返回weakref.proxy:return weakref.proxy(returnval)
  2. 或者在調用func weakref.proxy(func)時將返回值包裝在weakref.proxy中

     import pandas import weakref mkt_df = weakref.proxy(pandas.read_csv(filepath_or_buffer='filepath', delimiter=',')) print(mkt_df) 

我無法讓它們工作,因為我在代理時遇到引用錯誤ReferenceError:弱引用的對象不再存在

這是完全可能的,但它也沒用。 除非函數在其他地方存儲強引用(內部緩存等),否則當您在weakref.ref / weakref.proxy包裝調用時,會發生以下情況:

  1. 函數返回一個強引用(只存在一個強引用,所有者是調用者)
  2. 強引用傳遞給ref / proxy構造函數(將強引用所有權轉移到弱引用構造函數作為局部變量),創建弱引用
  3. 一旦構造函數返回,它就會釋放對它傳遞的參數的強引用
  4. 由於不存在其他強引用,因此立即釋放返回值,並清除弱引用

簡單地說,弱引用只有在你期望強引用會在其他地方停留一段時間時才有用; 在這種情況下,你保證在正常情況下它不會,所以弱引用是沒用的。

如果你想要一個有用的弱引用,你需要在某處存儲一個強引用,然后從中創建一個弱引用,例如:

mkt_df_strong = pandas.read_csv(filepath_or_buffer='filepath', delimiter=',')
mkt_df_weak = weakref.proxy(mkt_df_strong)
# The weak reference now remains useful until the strong reference disappears

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM