2014-06-11 70 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

相关问题