你可以使用一個lambda
表達:
>>> x = None
>>> y = None
>>> r = lambda : x*y
>>> r()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
>>> x = 1
>>> y = 2
>>> r()
2
你甚至可以得到多一點花哨的類:
class DeferredEval(object):
def __init__(self,func):
self.func = func
def __call__(self):
return self.func()
def __add__(self,other):
return self.func() + other
def __radd__(self,other):
return other + self.func()
x = None
y = None
r = DeferredEval(lambda:x*y)
try:
a = 1 + r
except TypeError as err:
print "Oops, can't calculate r yet -- Reason:",err
x = 1
y = 2
print 1 + r
print r + 1
與輸出:
Oops, can't calculate r yet -- Reason: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
3
3
當然,如果你想做的事情不需要,在這裏你需要添加更多的方法加法,減法,... 當然,那麼你必須實際上致電r
爲了得到你的結果 - 但這不是很糟糕嗎?
您是否嘗試過lambda表達式(實際上是函數對象)? – martineau
我在一年前問了一個非常類似的問題,並得到了[這個最優秀的答案](http://stackoverflow.com/a/7844038/566644),它得到了少得多的票比它應得的。 –
這裏你真正的目標是什麼?如果你能告訴我們,我認爲會有更清潔的解決方案。我認爲你有一個設計問題,而不是一個python問題。 – Ber