返回

活用 Python 中的 Type Hints 功能,轻松实现参数校验

后端



在 Python 开发中,参数校验这件事一直让我很苦恼;校验嘛,就得写很多与业务不相关的 if/else,特别麻烦;不校验嘛,又担心会有哪些意料之外的 bug。归功于 Python 动态语言的特性,这让我时常陷入一种纠结的状态。

直到最近,我了解到 Python 中的 Type Hints 功能。这个特性可以让我在函数或类的参数中指定类型,并且在运行时对参数进行校验。这大大减少了编写与业务无关的 if/else 语句,也让我更放心地运行代码。

当然,Type Hints 并不是 Python 的银弹。它也有其自身的局限性。例如,它不能保证参数的正确性,也不能防止恶意攻击。但对于大多数的场景来说,Type Hints 已经足够了。

如果你和我一样,曾经为参数校验而烦恼,那么我强烈建议你学习和使用 Type Hints。它会让你在 Python 开发中事半功倍。




Python 中 Type Hints 的使用方法

在 Python 中,可以使用注释的形式来指定函数或类的参数类型。注释的语法如下:

def function_name(param1: type, param2: type) -> type:
    ...

其中:

  • function_name 是函数的名称。
  • param1param2 是函数的参数名称。
  • type 是参数的类型。
  • -> 表示函数的返回值类型。

例如,下面的函数定义了一个名为 add_numbers 的函数,该函数接受两个整型参数,并返回一个整型的结果。

def add_numbers(a: int, b: int) -> int:
    return a + b

当我们调用 add_numbers 函数时,如果传递的参数类型不正确,Python 解释器会抛出一个 TypeError 异常。例如,下面的代码会抛出一个 TypeError 异常,因为第一个参数不是一个整数。

add_numbers("hello", 10)

Type Hints 也可以用于类的方法中。方法的语法与函数的语法类似。例如,下面的代码定义了一个名为 Car 的类,该类有一个名为 drive 的方法。drive 方法接受一个整型参数,并返回一个字符串。

class Car:
    def drive(self, speed: int) -> str:
        return f"The car is driving at {speed} km/h."

当我们调用 drive 方法时,如果传递的参数类型不正确,Python 解释器会抛出一个 TypeError 异常。例如,下面的代码会抛出一个 TypeError 异常,因为第一个参数不是一个整数。

car = Car()
car.drive("fast")

Type Hints 的局限性

Type Hints 并不是 Python 的银弹。它也有其自身的局限性。例如:

  • Type Hints 不能保证参数的正确性。例如,下面的代码会通过 Type Hints 的校验,但它会抛出一个 ValueError 异常,因为第一个参数是一个负数。
def add_positive_numbers(a: int, b: int) -> int:
    return a + b

add_positive_numbers(-1, 10)
  • Type Hints 不能防止恶意攻击。例如,下面的代码会通过 Type Hints 的校验,但它会执行一个危险的操作。
def delete_file(filename: str) -> None:
    os.remove(filename)

delete_file("/etc/passwd")
  • Type Hints 只能在运行时进行校验。这意味着在编译时无法发现类型错误。

尽管 Type Hints 有其局限性,但对于大多数的场景来说,它已经足够了。

结语

Type Hints 是 Python 中一个非常有用的特性。它可以帮助我们轻松实现参数校验,减少编写与业务无关的 if/else 语句,提高代码的可读性和可维护性。如果你还没有使用过 Type Hints,我强烈建议你学习和使用它。