Python的管道符(|)联合类型语法糖

python 复制代码
def create_access_token(data: dict, expires_delta: timedelta | None = None) -> str:
    to_encode = data.copy()
    expire = datetime.now(timezone.utc) + (
        expires_delta
        if expires_delta
        else timedelta(minutes=settings.access_token_expire_minutes)
    )
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, settings.jwt_secret_key, algorithm=settings.jwt_algorithm)

代码运行报错:

def create_access_token(data: dict, expires_delta: timedelta | None = None) -> str: TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'

问题分析

timedelta | None 是 Python 3.10 才引入的管道符(|)联合类型语法糖 ,如果你的 Python 版本低于 3.10,解释器会把 | 当成普通的运算符,试图计算 type(timedelta)NoneType 的 "或运算",这显然是不支持的,因此抛出 TypeError

解决方案

只需要把新的联合类型写法改成兼容低版本 Python 的标准写法即可,有两种方式:

方式 1:使用 Union 类型(兼容所有 Python 3 版本)

这是最通用的写法,需要先从 typing 模块导入 Union

python 复制代码
from datetime import datetime, timedelta, timezone
from typing import Union  # 导入Union类型
import jwt
# 假设你的settings模块是这样的,需根据实际情况调整
class Settings:
    access_token_expire_minutes = 30
    jwt_secret_key = "your-secret-key-here"
    jwt_algorithm = "HS256"

settings = Settings()

def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None) -> str:
    to_encode = data.copy()
    expire = datetime.now(timezone.utc) + (
        expires_delta
        if expires_delta
        else timedelta(minutes=settings.access_token_expire_minutes)
    )
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, settings.jwt_secret_key, algorithm=settings.jwt_algorithm)

# 测试代码(可选)
if __name__ == "__main__":
    token = create_access_token({"sub": "user123"})
    print("生成的Token:", token)

方式 2:升级 Python 到 3.10+(推荐长期方案)

如果你的项目环境允许,直接把 Python 版本升级到 3.10 或更高,就可以直接使用 timedelta | None 的写法,无需修改代码。

总结

  1. 报错根源:Python 版本 < 3.10 不支持 | 联合类型语法,将其识别为非法运算符。
  2. 快速修复:导入 typing.Union,用 Union[timedelta, None] 替代 timedelta | None
  3. 长期方案:升级 Python 到 3.10+,保留更简洁的 | 语法。
相关推荐
MediaTea18 小时前
<span class=“js_title_inner“>Python:实例对象</span>
开发语言·前端·javascript·python·ecmascript
feasibility.19 小时前
多模态模型Qwen3-VL在Llama-Factory中断LoRA微调训练+测试+导出+部署全流程--以具身智能数据集open-eqa为例
人工智能·python·大模型·nlp·llama·多模态·具身智能
我需要一个支点19 小时前
douyin无水印视频下载
爬虫·python
喵手19 小时前
Python爬虫实战:采集各大会展平台的展会名称、举办时间、展馆地点、主办方、行业分类等结构化数据(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集大会展平台信息·展会名称举办时间展馆地址·采集数据csv/json导出
编码者卢布19 小时前
【Azure APIM】如何实现对经过APIM并到达后端服务请求的全链路追踪呢?
python·flask·azure
0思必得019 小时前
[Web自动化] Selenium执行JavaScript语句
前端·javascript·爬虫·python·selenium·自动化
焱童鞋19 小时前
解决 MeteoInfoLab 3.9.11 中 contourfm 导致的 ArrayIndexOutOfBoundsException
开发语言·python
封奚泽优19 小时前
化学配对记忆游戏:用Python和Pygame打造趣味化学学习工具
python·pygame
梦幻精灵_cq19 小时前
问题切入『视角很重要』——ansi-color有效编码序列“单背景判定”小部件的“简洁精妙”
python
有代理ip19 小时前
成功请求的密码:HTTP 2 开头响应码深度解析
java·大数据·python·算法·php