我应该返回None还是(None,None)?

时间:2011-08-16 18:14:16

标签: python python-3.x coding-style

我们有一个返回城市/州元组的对象方法,即('Boston', 'MA')。在某些有效情况下,没有有效的城市/州返回。从风格上讲,在这种情况下返回None或包含(None, None)的两元素元组更有意义吗?

9 个答案:

答案 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,您将更容易检查返回值。