我在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中实现该功能?
答案 0 :(得分:3)
您无法强制使用if x is not None
,因为您无法覆盖id()
的行为。 is
运算符在内部比较被比较的两个对象的id,并且您无法控制该行为。
但是,您可以分别通过覆盖您班级的__eq__
和__ne__
方法来强制使用if x != None
或if 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()
评估为y
或True
(后来会y
),这将导致打印None
。
这是有效的,因为python会计算and
表达式,直到结果清晰。如果第一个操作数为true,则结果为clear(true),并返回第一个操作数。如果为false,则返回第二个操作数,因为它现在表示结果。
在更复杂的情况下,您还可以使用内联:
print 'true' if condition else 'false'