我知道 Python 本身是强类型的,而且非常强。标题里的强类型是指能够“锁住”动态类型的情况。
通常我们用 Python 开发工具时都是很享受动态类型的便利性和开发速度的,随着 3.6 开始添加 typehints ,慢慢地,类型系统也在向类 typescript 迁移。我个人是完全不喜欢把 python 写成 java 的写法的,无限的类型约束加上死板的写法,以及强行实现的毫无必要的设计模式,我感觉这是纯脑瘫行为。但是我欣然接受在关键节点、关键组件和关键模块引入严格的类型检查,以我的经验来看可以有效减少开发过程中 bug 产生。
举例来说就是,python 的灵活性让我们可以向任意变量传入任意类型,如果想传入固定数据结构,可以通过注释约束,但没有解释器保障。往往我们推崇防御性编程,实际参与多人项目提交代码时,如果传入复杂结构就需要进行多重校验,以确保程序执行正常。
persons = [
{
"姓名": "张三",
"年龄": 19
}
]
例如如果想编写一个函数接受上述输入,防御性的写法可能是
def func(persons: list[...]):
if not persons:
return ... # err1
person_one = persons.pop(0)
age = person_one.get("年龄")
if age is None:
return ... # err2
# else
... # 业务逻辑
加入以上大段代码,可以在发生手抖输入错误,数据清洗不到位,或者程序未知细节处产生未知行为时让函数仍然符合设计工作。缺点可能是行数太多,说实话也完全丧失了灵活性优势。
我寻思既然已经 2024 年了,typehints 用来描述类型倒是没啥问题。问题是现在社区出没出什么方案,可以在编译器或者运行时阶段检查输入和输出两个节点,把函数掐头去尾一下,我感觉 bug 都会少很多。
from typing import List, TypedDict
class Person(TypedDict)
name: str
age: int
def func(persons: List[Person]):
age = persons.pop(0).get("age") + 1
return ...
不知道有没有什么东西能实现上述效果,可以结合 typing 确保输入类型准确,避开检查代码的。目前。目前来说上面这套写法只有解释器检查,在动态的过程中没办法做任何检查,也就是说如果三方库,或者自己写的代码有 bug ,导致了任何的意料外行为时没有办法起到任何的防御性作用,debug 又是地狱了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.