Python 如何强制;不是没有”;测试

Python 如何强制;不是没有”;测试,python,Python,我有一个Python API,它可以返回一个对象,如果找不到对象,则返回None。我希望避免运行时异常/崩溃等,因此我希望强制API的用户执行不是无测试 例如: 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++中的类似代码中,我可以

我有一个Python API,它可以返回一个对象,如果找不到对象,则返回
None
。我希望避免运行时异常/崩溃等,因此我希望强制API的用户执行
不是无
测试

例如:

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中还有其他方法可以实现该功能吗?

如果x不是None,则不能强制使用
,因为不能重写
id()的行为。
is
操作符在内部比较正在比较的两个对象的ID,您无法控制该行为

但是,如果x!=None
如果不是x==None
分别重写类的和方法

然而,这不是一个好的做法。正如@Kevin在评论中所指出的,
is
是与
None
相比的首选运算符


我要做的是为这个API编写清晰有序的文档,然后明确警告用户实例化可能失败并返回
None
。然后,通过提供一个带有内置函数的示例或一个带有
is not None
检查的示例,轻轻地将用户推向良好实践。

正如前面所说,您不能覆盖
is
行为

要执行所需操作,基本上可以创建一个具有
getName()
函数的代理对象。要让用户检查函数是否失败,可以让对象计算为
False
。(这是一种标准做法,我认为这比使用
\uuuu eq\uuu
操作符使对象等于
None
要好)。要执行此操作,您可以覆盖覆盖
\uuuuu nonzero\uuuu()
,使其返回
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()

一般来说,在Python中,“如何强制我的用户……”的答案是“你不能;一个足够确定的用户可以在C++中的类似代码中覆盖你的每一个尝试”<代码>,我可以添加一个标志,当我调用GETNAME()时,它将被检查,标志只在比较对象到NUL/<代码>时设置。你能展示一个代码示例吗?如果对象本身为空,如何对其调用
getName
?避免返回
None
,以支持。为什么不让API引发错误而不是返回
None
?然后,用户将被迫处理错误或承担后果。为避免崩溃,请检查用户是否未向API传递
None
。任何其他崩溃都是他们的责任,而不是你的责任。特别是因为
是无的
是检查
None
的方法。我知道这是无的,是检查的首选方法,这就是为什么我试图钩住它。所讨论的API是一个内部API,而不是外部API,所以我几乎可以控制人们如何使用它,而不是他们的代码质量。@MaxShifrin这是您第一次提到它是一个内部API。@MaxShifrin API的内部性或外部性与此无关。如果您能够告诉用户他们必须使用
而不是None
,那么您还可以告诉他们为什么应该使用它,以及如果他们不使用它会发生什么。开导比强制好。所有这些都可能会出现在文档中,除非您想亲自指导API的每个用户。