我们有一个返回城市/州元组的对象方法,即('Boston', 'MA')
。在某些有效情况下,没有有效的城市/州返回。从风格上讲,在这种情况下返回None
或包含(None, None)
的两元素元组更有意义吗?
答案 0 :(得分:57)
我会返回None
。如果没有结果,为什么要返回看起来的结果呢?
测试也更容易:
result = getCity()
if result:
# do something
如果两个值中只有一个是(None, None)
(即None
),我只会返回('Boston', None)
。在这种情况下会更加一致。
答案 1 :(得分:44)
通过仅在特殊情况下返回一个值,您可能会破坏元组解包成语。您的一些来电者可能会发出:
city, state = getCityStateTuple("something")
在这种情况下,返回None
会破解来电者并出现错误:
TypeError: 'NoneType' object is not iterable
所以,我个人会在你的情况下返回(None, None)
。然后,您的里程可能会有所不同,这取决于您的来电者使用的模式。
答案 2 :(得分:11)
(None, None)
在Python中未评估为False
。此外,构建元组需要更多的工作,而不是构建元组。所以我更喜欢None
。
答案 3 :(得分:11)
正如其他人所说,包含其中项目的元组不会测试为False
,这是您可能想要返回None
而不是(None, None)
的一个原因。但是,有可能编写一个元组子类,即使在其中包含项目时,也会通过覆盖其False
方法来测试__nonzero__()
。
class falsetuple(tuple):
def __nonzero__(self):
return False
然后,当没有可用值时,您可以返回falsetuple((None, None))
。实际上,您始终可以返回相同的 falsetuple
。
我不一定建议你这样做,事实上我对藐视这个惯例有严重的疑虑,我只是说非空元组的真实性本身并不一定是不返回元组的理由
答案 4 :(得分:6)
如果你的例程通常会返回一个元组,那么元组就应该继续返回。真正的选择是在返回(None, None)
或提出异常之间,而我们没有足够的信息来提供有关这方面的好建议。
如果是我,并且我选择了异常的元组,我会选择FalseTuple,这有点建议,并且还意识到调用代码(使用元组解包)也可以测试
if city is None:
查看是否获得了有效的结果。这样你就可以支持所有可能返回值的元组提取,并且仍然允许使用pythonic成语来询问对象,“你评价为真吗?” (这完全符合以下情况):
class FalseTuple(tuple):
def __nonzero__(self):
return False
答案 5 :(得分:4)
为什么不让国家成为城市的财产?这样你的函数总会返回一个值:一个城市或无。
返回(无,无)对于其他答案中陈述的所有原因都不好,仅用于支持元组解包。
返回状态的最佳值是没有返回有效城市的状态,但是返回1或2值的函数不是那么好,再次因为元组解包。
答案 6 :(得分:2)
对我来说,返回(None,None)意味着(None,State)或(City,None)也是有效的返回值。 如果是这种情况,请使用(None,None),否则,Felix和Brent提供非常好的参数,只需返回None。
答案 7 :(得分:1)
我会为返回的对象实现一个公共方法,假设isValidLocation()
如果位置有效则返回true,如果location为none则返回false。
答案 8 :(得分:1)
如果您返回None,您将更容易检查返回值。