如何强制“不是无”测试

时间:2015-04-08 12:40:55

标签: python

我在Python中有一个可以返回对象的API,如果没有找到对象,我会有None。我想避免运行时异常/崩溃等,因此我想强制我的API用户进行is not None测试。

例如:

x = getObject(...)
if x is not None:
   print x.getName()  #should be o.k.


y = getObject(...)
print y.getName() # print an error to the log

我怎样才能做到这一点?

在C ++的可比代码中,我可以添加一个标志,当我调用getName()时将检查该标志;仅在将对象与NULL进行比较时才设置标志。

但是,在Python中,我无法重载is运算符。有没有其他方法可以在Python中实现该功能?

3 个答案:

答案 0 :(得分:3)

您无法强制使用if x is not None,因为您无法覆盖id()的行为。 is运算符在内部比较被比较的两个对象的id,并且您无法控制该行为。

但是,您可以分别通过覆盖您班级的__eq____ne__方法来强制使用if x != Noneif not x == None

然而,这不是 的良好做法。正如@Kevin在评论中指出的那样,is是与None比较时首选的运算符。

我要做的是为此API编写清晰且有组织的文档,然后明确警告用户实例化可能会失败并返回None。然后,通过提供内置getattr函数的示例或带有is not None检查的示例,轻轻地推动用户采用良好做法。

答案 1 :(得分:0)

就像已经说过的那样,你无法覆盖is行为。

要做你想做的事,基本上你可以创建一个具有getName()功能的代理对象。要让用户检查功能是否失败,您可以将对象评估为False。 (这是一种标准做法,我认为这比使用None运算符使对象等于__eq__更好。要执行此操作,您可以覆盖覆盖__nonzero__(),使其返回False

示例:

class GetObjectFailed(object):
    def __nonzero__():
         return False
    def getName():
         return "An error has occurred" # You could specify a specific error message here...

x = getObject(...)
print x # prints "An error has occurred"
if x:
    # This is the recommended way of doing things
    # Do something with the object
    x.proccess()
if x is not None:
    # This will never work
    x.proccess()
if x != None:
    # This is possible but not recommended
    x.proccess()

答案 2 :(得分:-3)

在您的情况下,您可以使用简单的and表达式:

print y and y.getName()

如果y.getName()评估为yTrue(后来会y),这将导致打印None

这是有效的,因为python会计算and表达式,直到结果清晰。如果第一个操作数为true,则结果为clear(true),并返回第一个操作数。如果为false,则返回第二个操作数,因为它现在表示结果。

在更复杂的情况下,您还可以使用内联:

print 'true' if condition else 'false'