关于python:Pythonic处理验证的方法

Pythonic way to handle validation

我正在编写一个小函数,它接受一个整数值和一个字符串,如:

1
2
param1: 1
param2:"1 1 1"

该函数将拆分字符串参数并对第一个参数验证其len,如下所示:

1
2
3
4
5
def prepare_integer_set(expected_len, integer_string):
    prepared_integer_set = integer_string.split()
    if len(prepared_integer_set) != expected_len:
        raise ValueError('Number of expected integers does not match integer string')
    return [int(x) for x in prepared_integer_set]

然而,例外是困扰我。 我宁愿返回false,因为输入来自用户,因此如果它们出错,则不是严格的例外。

应如何处理? 拆分方法2,有单独的验证和准备方法? 或者它是pythonic,因为它目前是通过抛出异常?

这将是拆分的替代方案:

1
2
3
4
5
6
7
def validate_integer_set(expected_len, integer_set):
    return expected_len == len(integer_set)


def prepare_integer_set(integer_string):
    prepared_integer_set = integer_string.split()
    return [int(x) for x in prepared_integer_set]


您需要确定prepare_integer_set()正在做什么:

  • 如果它只是验证用户输入,则应返回TrueFalse。如果它返回True,则您正常处理数据。
  • 如果它正在对数据做某事,那么无效数据应该导致异常。
  • 您也可以返回None或其他一些虚假值,但要小心。如果您的正常返回值也可能是假的(例如空列表),那么这可能会造成比它的价值更多的麻烦。


如果您不想引发错误,我会返回False,然后在继续之前使用简单的if检查:

1
2
3
4
5
6
7
8
9
10
def prepare_integer_set(expected_len, integer_string):
    prepared_integer_set = integer_string.split()
    # catch 0 and negative input
    if len(prepared_integer_set) != expected_len or expected_len  < 1:
        return False
    return [int(x) for x in prepared_integer_set]

val = prepare_integer_set(2,"1 2")
if val: # if length test failed it will evaluate to False else we have a list of ints which will evaluate to True
    ...

您还必须考虑输入,如prepare_integer_set(3,"1 2 foo"),它将通过您当前的长度测试,但在投射时失败。因此,您可能希望再次使用try/except返回False。

1
2
3
4
5
6
7
8
def prepare_integer_set(expected_len, integer_string):
    prepared_integer_set = integer_string.split()
    if len(prepared_integer_set) != expected_len or expected_len  < 1:
        return False
    try:
        return [int(x) for x in prepared_integer_set]
    except ValueError:
        return False

如果你不认为错误的长度是一个错误,那么无法转换为int的输入应该被视为相同或两者都应被视为错误并引发异常而不是返回False。真的你所做的返回值应该决定你是应该引发一个错误还是返回错误的输入,我不认为对这两种情况做不同的事情是个好主意。