2017-05-09 49 views
0

我有一个Python函数,看起来大致是这样的:的Python:测试如果x是一个特别的方法对象

def f(x): 
    [...] 
    g(x) 

有时候,我无法控制的原因x<bound method A.b of <A: a>>类型。 g()位于第三方库中,无法处理此参数并引发异常。因此,我想要做的g()调用之前是测试这种情况下,做点别的:现在

def f(x): 
    [...] 
    if x == A.b: 
     doSometingElse() 
    else: 
     g(x) 

==似乎并没有工作,因为它是不正确的。什么是测试我的变量x是否包含方法A.b的正确方法?

+1

尝试'is_instance'。或使用'try ... catch'来捕获异常。 – stamaimer

+0

'try ... catch'在我的情况下不是一个选项,因为它会过早地中止'g()' – Carsten

+0

对于'isinstance(x,Y)''Y'究竟是什么? – Carsten

回答

2

当在对象上访问时,类中的函数变为绑定方法,或者在类上访问时变为未绑定方法。在Python 2中,两种类型都有一个引用该函数的func属性。所以,你的测试可能看起来像:

if x.__func__ is A.b.__func__: 

在Python 3这是一个更容易一些:

if x.__func__ is A.b: 
+0

如果你不关心python2.5及以下版本(谁干的?)'.__ func__'也可以在python2.6和python2.7中工作 –

+0

这个技巧。我只测试了Python 3的情况,因为这就是我目前使用的 – Carsten

+1

@AnonySottile好点,我没有意识到!我已经更新了答案。 –

-1

也许尝试扔一试,除非有

def f(x): 
    [...] 
    try: 
     g(x) 
    except: 
     do something else 

这将是处理它的最简单的方法。

+0

不幸的是,这不会起作用,因为它会导致'g()'在完成所有需要做的事情之前中止。 – Carsten

相关问题