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

dav*_*off 54 python coding-style python-3.x

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

Fel*_*ing 57

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

它也更容易测试:

result = getCity()
if result:
   # do something
Run Code Online (Sandbox Code Playgroud)

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

  • +1我可能会在try/catch中包含一个元组解包赋值(`city,state = getTuple(...)`).这似乎与我的python哲学一致:尝试,而不是测试.此外,通过这种方式,呼叫站点可以选择将其视为需要异常的异常情况. (14认同)
  • @Ethan,是的,这就是我的回答.返回`None`将提高`TypeError`*从来电者的代码*如果它使用的元组拆包成语,它可能合法地做,如果它从来没有遇到过在测试过程中的特殊情况,因为该函数应该在第一返回一个元组地点.即使依赖流控制的异常(在Python中可以说是鼓励的),在这种情况下我仍然关心我的调用者,至少从我自己的代码中引发异常. (2认同)

Fré*_*idi 44

通过在特殊情况下仅返回一个值,您可能会破坏元组解包成语.您的一些来电者可能会发出:

city, state = getCityStateTuple("something")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,返回None将使错误中断调用者:

TypeError: 'NoneType' object is not iterable

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

  • 这个怎么样?`city, state = getCityStateTuple("something") 或 (None, None)` (2认同)

Bre*_*wey 11

(None, None)不会False在Python中评估.此外,构建元组需要更多的工作,而不是构建元组.所以我更喜欢None.


kin*_*all 11

正如其他人所指出的那样,其中包含项目的元组不会测试False,这是您可能想要返回None而不是返回的一个原因(None, None).但是,有可能编写一个元组子类,False即使它在其中包含项目时也会通过重写其__nonzero__()方法进行测试.

class falsetuple(tuple):
    def __nonzero__(self):
        return False
Run Code Online (Sandbox Code Playgroud)

然后,falsetuple((None, None))当没有可用值时,您可以返回.事实上,你总是可以返回相同的 falsetuple.

我并不建议您这样做,其实我对这个嘲弄约定,我只是说,非空元组的感实性不一定本身就是一个理由不返回一个元组严重疑虑.


Eth*_*man 6

如果你的例程通常返回一个元组,那么元组就应该继续返回.真正的选择是在返回(None, None)或提出异常之间,而我们没有足够的信息来提供有关这方面的好建议.

如果是我,并且我选择了异常的元组,我会使用FalseTuple那个有点建议,并且还意识到调用代码(使用元组解包)也可以测试

if city is None:
Run Code Online (Sandbox Code Playgroud)

看看是否获得了有效的结果.这样你就可以支持所有可能返回值的元组提取,并且仍然允许使用pythonic成语来询问对象,"你评价为真吗?" (这完全符合以下情况):

class FalseTuple(tuple):
    def __nonzero__(self):
        return False
Run Code Online (Sandbox Code Playgroud)