如何在 python 3.6 中注释嵌套字典?

Posted

技术标签:

【中文标题】如何在 python 3.6 中注释嵌套字典?【英文标题】:How to annotate nested dictionary in python 3.6? 【发布时间】:2021-09-24 11:50:02 【问题描述】:

我有一本像下面这样的字典:

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,

我想用整数类型注释以下键以检查它是否始终为整数:

'REFRESH_TOKEN_EXPIRE_SECONDS': 30 * 24 * 60 * 60,

作为整数。在 python 3.6 中,我们没有 TypedDict。我可以用什么代替它?

【问题讨论】:

当你说注释时,你到底在注释什么,它有什么不同? 【参考方案1】:

字典内部的对象类型被保留。您可以在字典中设置值的类型(因为该值实际上是它自己的对象,具有自己的类型)。

在您的示例中,您可以将值的类型设置为 int:

OAUTH2_PROVIDER['REFRESH_TOKEN_EXPIRE_SECONDS']=int(
    OAUTH2_PROVIDER['REFRESH_TOKEN_EXPIRE_SECONDS']
)

print(type(OAUTH2_PROVIDER['REFRESH_TOKEN_EXPIRE_SECONDS'])) #=> <class 'int'>

编辑: 了解 OP 删除嵌套 if 语句 here 的核心问题:

您可以简单地添加一个强制 int 类或引发错误的 if 语句:

REFRESH_TOKEN_EXPIRE_SECONDS = oauth2_settings.REFRESH_TOKEN_EXPIRE_SECONDS
if not isinstance(REFRESH_TOKEN_EXPIRE_SECONDS, int):
    REFRESH_TOKEN_EXPIRE_SECONDS = timedelta(seconds=REFRESH_TOKEN_EXPIRE_SECONDS)
else:
    e = "REFRESH_TOKEN_EXPIRE_SECONDS must be an int"
    raise ImproperlyConfigured(e)
refresh_expire_at = now - REFRESH_TOKEN_EXPIRE_SECONDS

【讨论】:

如果我写 'REFRESH_TOKEN_EXPIRE_SECONDS': "hello", 在这种情况下,您将使用字符串覆盖对象类型。我觉得您正在参考特定的用例。您能否详细说明您正在尝试做什么(更大的项目)? 添加了一个编辑,允许您删除 timedelta 检查,而不是查找 int 对象,否则会引发错误。这击中了你硬编码的 int 钉子。 但无论如何,我如何使用,比如说,typing.Dict 来注释这个字典的类型?

以上是关于如何在 python 3.6 中注释嵌套字典?的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套字典转换为表/父子结构,Python 3.6

如何将字典的格式更改为 value1;key1;在 Python 3.6 中?

字典是在 Python 3.6+ 中排序的吗?

如何在 Python 中初始化嵌套字典

python如何读取嵌套字典里的值?

如何在Python中更改嵌套字典中键的值[关闭]