在这种情况下,我应该更喜欢“请求许可”吗?

2024-06-08 01:58:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的函数中,我期望一个参数可以是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是长度3str呢?代码会将其视为元组。你知道吗

在这种情况下我该怎么办?诉诸类型检查?是不是少了点“Python”?请解释一下最'Python'的解决办法,为什么它是这样。你知道吗


Tags: to函数类型参数stringdefashandle
3条回答

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

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

在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元素元组),就会出现一个适当的异常。在您的原始代码中,您必须以某种方式自行处理此问题(以避免运行认为它是字符串的代码)。你知道吗

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

相关问题 更多 >

    热门问题