我有以下代碼用於懶惰地計算python 3.5中的值。我也嘗試了@cached_property
decorator,結果相同,所以我會用它來簡化。如何避免在Python中傳遞作爲參數的惰性屬性評估
class Foo:
@property
def expensive_object(self):
if not hasattr(self, "_expensive_object"):
print("Lengthy initialization routine")
self._expensive_object = 2
return self._expensive_object
的問題是,它被評價時,我將它作爲一個參數傳遞給函數,即使它最終不被內部使用,如在此示例中:
def bar(some_parameter, another_parameter):
if some_parameter != 10:
print(some_parameter)
else:
print(another_parameter)
從以下輸出我們看到它只是被傳遞而被評估,但它並不是絕對必要的,因爲代碼沒有嘗試使用它。
In [23]: foo1 = Foo()
...: bar(3, foo1.expensive_object)
Lengthy initialization routine
3
In [24]: bar(3, foo1.expensive_object)
3
有很多這我的腳本可以甚至無需評估運行情況,但它結束了反正這樣做,因爲這樣的情況。 分解參數也是不實際的。我也在組成成員對象的__init__
中使用它。
如果可能,我想讓該屬性更懶,因爲它只應在實際閱讀時進行評估。
使其懶惰是讓它的唯一辦法一個'bar'知道在必要時調用的函數。函數參數總是立即評估。 – chepner