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,提问作者Павел Иванов
相关产品推荐
相关产品推荐

