我是否应该更喜欢并且要求获得许可'在这种情况下?

时间:2015-12-25 18:14:45

标签: python exception coding-style

在我的函数中,我期待一个可能是tuplestr的论证。作为Python的新手,我已经学会了乞求宽恕'比要求许可更好。因此,我没有检查参数的类型,而是这样做:

def f(a):
    try:  # to handle as tuple
        e1, e2, e3 = a
        ...
    except ValueError:  # unpacking failed, so must be a string.
        pass
    # handle as string

然而,这并不总是奏效。如果a长度为str 3,该怎么办?代码会将其视为元组。

在这种情况下我该怎么办?求助于打字检查?是不是更少' Pythonic'?请解释最多' Pythonic'解决方案以及为何如此。

3 个答案:

答案 0 :(得分:2)

Python有isinstance()函数是有原因的。有时检查参数的类型是正确的做法;这里完全可以接受。

答案 1 :(得分:2)

在Python中进行类型检查是完全正确的,特别是当你想为了函数重载的目的而这样做时。

但我建议你对字符串进行类型检查,而不是元组。虽然看起来你总是会传递一个元组,但是很多情况下传递不同的序列也可能有很大的意义,例如列表也很完美。

所以你应该按原样保留逻辑,但首先要检查字符串输入:

def f(a):
    if isinstance(a, str): # in Python 2, check against `basestring`
        # handle as string
        # …
    else:
        # handle as tuple
        e1, e2, e3 = a
        # …

这样,如果解包没有成功,例如有人传递了2个元素的元组,你就会得到一个适当的异常。在原始代码中,您必须以某种方式自己处理(避免运行认为它是字符串的代码)。

答案 2 :(得分:1)

显式优于隐式:定义两个函数,一个用于元组,另一个用于字符串。第二个最好的选择是,有一个带三个参数的函数,其中两个是可选的:

def f(e1, e2=None, e3=None):
    if e2 is None and e3 is None:
        # a string
    else:
        # three strings

最不可能的是检查参数的类型:

def f(a):
    if isinstance(a, basestring):
        # a string
    else:
        # perhaps a tuple