Python以简洁直观闻名。
但在静态类型设计上,有一个明显的槽点:同一类静态类型语义,却要用到两种完全不同的语法。
一边是类型注解,一边是装饰器。两者各管一摊,语义割裂,违背直觉。
先看代码:同是静态约束,写法天差地别
1. 用类型注解做静态约束
不管是固定结构的类,还是变量、函数,都用类型注解表达静态语义。
python
from typing import TypedDict, Optional
# 1. 类结构静态约束:TypedDict 注解
class User(TypedDict):
name: str
age: int
# 2. 变量静态约束:直接注解类型
user_info: User = {"name": "张三", "age": 28}
user_email: Optional[str] = None
# 3. 函数静态约束:参数与返回值注解
def get_user_age(user: User) -> int:
return user["age"]
这段代码里,所有静态类型约束,都用统一的注解语法。
清晰,直观,符合静态类型的基本直觉。
2. 用装饰器做静态类型标记
到了方法类型标记,画风突变。
静态方法、类方法,明明是静态类型语义,却要用到装饰器。
python
class UserService:
# 静态方法:用 @staticmethod 装饰器标记
@staticmethod
def validate_user(user: User) -> bool:
return bool(user.get("name") and user.get("age"))
# 类方法:用 @classmethod 装饰器标记
@classmethod
def create_default_user(cls) -> User:
return {"name": "默认用户", "age": 18}
这里的混乱感扑面而来。
同样是静态类型约束,前者用注解,后者用装饰器。
这种割裂带来的麻烦
-
增加认知负担
初学者要额外区分:哪些静态语义用注解,哪些用装饰器。
明明是同类需求,却要记两套语法规则。
-
破坏代码一致性
阅读代码时,要在两种语法逻辑间切换。
同样是"标记类型",写法却大相径庭,降低阅读效率。
-
违背最小惊讶原则
从 Java、Go 等静态语言转来的开发者,很难理解这种设计。
标记方法是否为静态,为何不用统一的类型注解,反而要用修改运行时行为的装饰器。
总结
这种设计,本质是历史包袱的产物。
但站在当下,它无疑是 Python静态类型体系里的一个明显缺憾。
好的语法设计,本该让同类语义有同类写法。
而不是让开发者,为语言的历史遗留问题买单。