如何在 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 中注释嵌套字典?的主要内容,如果未能解决你的问题,请参考以下文章