我应该退还还是(无,无)?

我们有一个返回城市/状态元组的对象方法,即('Boston', 'MA') 。 在一些有效的情况下,没有有效的城市/国家可以返回。 在风格上,在这种情况下返回None还是包含(None, None)的两元素元组更合理?

我会返回None 。 如果没有结果,为什么要返回看起来像结果的东西?

testing也更容易:

 result = getCity() if result: # do something 

如果可能只有两个值中的一个是None (即('Boston', None)('Boston', None)我将只返回(None, None) )。 在这种情况下会更加一致。

在特殊情况下只返回一个值,可能会破坏元组的开箱习语。 您的一些呼叫者可能会发出:

 city, state = getCityStateTuple("something") 

在这种情况下,返回None将打破调用者的错误:

TypeError: 'NoneType' object is not iterable

所以,我个人会在你的情况下返回(None, None) 。 然后再次,您的里程可能会有所不同,这取决于您的来电者使用的模式。

正如其他人所指出的,一个包含项目的元组不会被testing为False ,这是您可能想返回None而不是(None, None)一个原因。 但是,可以通过覆盖__nonzero__()方法编写一个testing为False的元组子类 ,即使其中包含项目也是如此。

 class falsetuple(tuple): def __nonzero__(self): return False 

那么当没有可用的值时falsetuple((None, None))你可以返回falsetuple((None, None)) 。 事实上,你总是可以返回相同的 falsetuple

我不一定build议你这样做,实际上我对这个惯例有严重的疑虑,我只是说非空元组的真实性本身不一定是不返回元组的原因。

(None, None)在Python中不计算为False 。 另外,构build元组需要更多的工作,而不是构build元组。 所以我宁愿None

如果你的例程通常返回一个元组,那么元组就是它应该返回的元组。 真正的select是返回(None, None)或者抛出exception,而我们没有足够的信息来提供很好的build议。

如果是我,而且我select了这个例外的元组,我将会使用这个FalseTuple,并且还意识到调用代码(使用元组拆包)也可以testing

 if city is None: 

看是否获得了有效的结果。 这样你就可以支持所有可能的返回值的元组抽取,并且仍然允许提出这个对象的pythonic习语:“你评价为True吗? (为了完整起见,这里也是一样):

 class FalseTuple(tuple): def __nonzero__(self): return False 

为什么不把国家作为城市的财产? 这样你的函数将总是返回一个值:City或None。

返回(无,无)对于其他答案中所述的所有原因都是不好的,并且仅用于支持元组解包。

没有什么是最好的值返回到没有有效的城市可以返回,但有一个函数返回1或2值是不是很好,再次因为元组解包。

对我来说,返回(None,None)意味着(None,State)或(City,None)也是有效的返回值。 如果是这样的话,请跟(无,无),否则,菲利克斯和布伦特提供了非常好的参数来简单地返回无。

我将为返回的对象实现一个公共方法,假设isValidLocation()在位置有效时返回true,如果位置为none,则返回false。

如果您返回无,您将更容易检查返回值。