2014-06-11 106 views
1

我想創建一個庫,用於計算未知變量的表達式。爲了做到這一點,我做了這樣的事情。如何實現既可以接受Python中的內置類型又可以接受自定義類的函數?

A = Forward() # Syntax from pyparsing 
C = Forward() 
B = A * 4 + C# B has Expr type. 
A << 4 
C << 4 
# B can be evaluated to value 20 now 
D = 8 

print(Evaluate(B)) # should print 20 
print(Evaluate(A)) # should print 4 
print(Evaluate(D)) # should print 8 

我想有Evaluate函數接受int,Forward,Expr和更多類型。由於int類型不能具有自定義方法,因此簡單的鴨子打字似乎不起作用。

是否有比這更pythonic嗎?

def Evaluate(x): 
    if isinstance(x, int): 
     return x 
    else: 
     return x.Evaluate() # Forward, Expr has Evaluate method. 

回答

4

如果所有的自定義類實現.Evaluate,你可以只是做

try: 
    return x.Evaluate() 
except AttributeError: 
    return x 
+1

這是Python的方式來做到這一點。也被稱爲「比權限更容易要求原諒」: http://programmers.stackexchange.com/questions/175655/python-forgiveness-vs-permission-and-duck-typing – steveha

相關問題