You need to enable JavaScript to run this app. Python 3.6无TypedDict时如何为嵌套字典指定键做整数类型标注
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.6无TypedDict时如何为嵌套字典指定键做整数类型标注

Python3.6环境下校验指定配置字段类型的替代方案

以下方案均原生支持Python3.6,无需引入额外依赖,可根据使用场景选择:

方案1:一次性独立校验函数(适合静态配置场景)

如果配置加载完成后不会再被修改,直接在配置定义完成后执行一次校验即可,实现最简单无侵入:

def validate_oauth2_config(config):
    refresh_expire_val = config.get('REFRESH_TOKEN_EXPIRE_SECONDS')
    if not isinstance(refresh_expire_val, int):
        raise TypeError(f"REFRESH_TOKEN_EXPIRE_SECONDS 必须为整数类型,当前为 {type(refresh_expire_val).__name__}")
    # 其余需要校验的字段可在此扩展规则

# 你的原有配置
OAUTH2_PROVIDER = {
    'SCOPES': {
        'read': 'Read scope',
        'write': 'Write scope',
        'userinfo': 'Access to user info',
        'full-userinfo': 'Access to full user info',
    },
    'DEFAULT_SCOPES': {
        'userinfo'
    },
    'ALLOWED_REDIRECT_URI_SCHEMES': ['http', 'https', 'rutube'],
    'PKCE_REQUIRED': import_string('tools.oauth2.is_pkce_required'),
    'OAUTH2_VALIDATOR_CLASS': 'oauth2.validator.OAuth2WithJwtValidator',
    'REFRESH_TOKEN_EXPIRE_SECONDS': 30 * 24 * 60 * 60,
    "ACCESS_TOKEN_EXPIRE_SECONDS": 3600,
}
# 配置定义完成后立刻执行校验
validate_oauth2_config(OAUTH2_PROVIDER)

方案2:自定义字典子类(支持运行时修改自动校验)

如果配置需要在运行过程中动态修改,可以继承dict重写__setitem__方法,只要修改指定键就自动触发类型校验:

class Oauth2ConfigDict(dict):
    def __setitem__(self, key, value):
        if key == 'REFRESH_TOKEN_EXPIRE_SECONDS' and not isinstance(value, int):
            raise TypeError(f"REFRESH_TOKEN_EXPIRE_SECONDS 必须为整数类型,当前为 {type(value).__name__}")
        super().__setitem__(key, value)

# 定义配置时使用自定义字典类
OAUTH2_PROVIDER = Oauth2ConfigDict({
    # 此处填写原有配置内容
})

后续不管是初始化赋值还是运行时修改OAUTH2_PROVIDER['REFRESH_TOKEN_EXPIRE_SECONDS'],都会自动校验类型,避免非法值写入。

方案3:配置类封装+属性校验(适合复杂项目配置管理)

如果项目配置项较多需要统一管理,可以将配置封装为类,通过property装饰器实现类型校验:

class Oauth2Config:
    def __init__(self):
        # 初始化原有配置
        self._config = {
            # 此处填写原有配置内容
        }
    
    @property
    def REFRESH_TOKEN_EXPIRE_SECONDS(self):
        return self._config['REFRESH_TOKEN_EXPIRE_SECONDS']
    
    @REFRESH_TOKEN_EXPIRE_SECONDS.setter
    def REFRESH_TOKEN_EXPIRE_SECONDS(self, value):
        if not isinstance(value, int):
            raise TypeError(f"REFRESH_TOKEN_EXPIRE_SECONDS 必须为整数类型,当前为 {type(value).__name__}")
        self._config['REFRESH_TOKEN_EXPIRE_SECONDS'] = value
    
    # 其余配置项的读写方法按需扩展

OAUTH2_PROVIDER = Oauth2Config()

使用时通过OAUTH2_PROVIDER.REFRESH_TOKEN_EXPIRE_SECONDS读写配置即可。


内容的提问来源于stack exchange,提问作者Павел Иванов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 12:03:03