我应该退还还是(无,无)?
我们有一个返回城市/状态元组的对象方法,即('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。
如果您返回无,您将更容易检查返回值。