typed_dict

这个模块负责对 TypedDict 这种类型注解进行数据建模. 我们后面的注释会以下面的代码作为例子:

class UserTypeDef(TypedDict):
    id: Required[int] # <--- 这是一个字段
    name: NotRequired[str] # <--- 这是另一个字段

class ModelTypeDef(TypedDict):
    attr1: UserTypeDef # <--- 这是一个嵌套 (nested) 的字段
    attr2: Required[UserTypeDef] # <--- 这是一个嵌套的字段
    attr3: NotRequired[UserTypeDef] # <--- 这是一个嵌套的字段
    attr4: Optional[UserTypeDef] # <--- 这是一个嵌套的字段
class boto3_dataclass.models.typed_dict.TypedDictFieldAnnotation(is_nested_typed_dict: bool = False, nested_type_name: str | None = None, nested_type_subscriptor: Literal['NULL', 'List'] = 'NULL')[source]

储存着 TypedDict 中的一个 field 的类型注解信息. 例如:

  • id: int 中的 int 部分, 不包括 id.

  • name: Required[str] 中的 Required[str] 部分.

Parameters:
  • is_nested_typed_dict – 是否是另一个 TypedDict 的类型. 例如 id: str, name: Required[str] 这些都不是嵌套的 TypedDict, 而 attr1: UserTypeDef 以及 attr2, attr3, attr4 都是嵌套的 TypedDict. 这个属性决定了我们在生成 dataclass 的 @cached_property 的时候, 是直接用 boto3_raw_data.get("field_name") 返回一直简单的值, 还是用 User(boto3_raw_data.get("field_name")) 返回一个对象.

  • nested_type_name – 如果是嵌套的 TypedDict 字段, 这里存储着嵌套的 TypedDict 的名称, 例如 ModelTypeDef 中都是 UserTypeDef. 只有在 is_nested_typed_dict 为 True 的情况下 才会有值, 否则为 None.

  • nested_type_subscriptor – 如果是嵌套的 TypedDict 字段, 这里存储着嵌套的 TypedDict 的 特殊形式. 目前只有 List 这一种特殊形式. 因为在 List 的情况下, @cached_property 需要用类似于 [User(dct) for dct in boto3_raw_data.get("field_name", [])] 的形式来生成代码. 而其他的形式, 例如 Required, NotRequired, Optional 都不需要特殊处理.

property nested_model_name: str

nested_model 对应的 dataclass 的类名, 例如 UserTypeDef 对应的就是 User.

class boto3_dataclass.models.typed_dict.TypedDictField(name: str, anno: ~boto3_dataclass.models.typed_dict.TypedDictFieldAnnotation = <factory>)[source]

储存着 TypedDict 的单个字段信息, 例如:

  • UserTypeDef.id

  • UserTypeDef.name

Parameters:
  • name – 字段名称, 例如 id, name, attr1, attr2, …

  • anno – 字段的类型注解信息, 见 TypedDictFieldAnnotation.

property safe_field_name: str

如果字段名称是 Python 的关键字, 那么在生成代码的时候需要加一个下划线后缀.

gen_code() str[source]

生成字段的代码字符串.

class boto3_dataclass.models.typed_dict.TypedDictDef(name: str, fields: list[~boto3_dataclass.models.typed_dict.TypedDictField] = <factory>)[source]

储存着 TypedDict 的定义信息, 例如:

class UserTypeDef(TypedDict):
    id: Required[int]
    name: NotRequired[str]
Parameters:
  • name – TypedDict 的名称, 例如 UserTypeDef

  • fields – TypedDict 的字段列表

property fields_mapping: dict[str, TypedDictField]

通过字段名称获取字段定义的映射, 例如 {"id": <TypedDictField>, "name": <TypedDictField>}.

property model_name: str

TypedDict 对应的 dataclass 的类名, 例如 UserTypeDef 对应的就是 User.

gen_code() str[source]

生成 TypedDict 的代码字符串.

class boto3_dataclass.models.typed_dict.TypedDefsModule(tdds: list[~boto3_dataclass.models.typed_dict.TypedDictDef] = <factory>)[source]

对应一个实现了所有 type_defs.pyi 文件中的 TypedDict 的 dataclass. 这个类储存着多个 TypedDictDef 的定义信息.

property tdds_mapping: dict[str, TypedDictDef]

通过 TypedDict 名称获取 TypedDict 定义的映射, 例如 {"UserTypeDef": <TypedDictDef>, ...}.

gen_code(type_defs_line: str) str[source]

生成整个模块的代码字符串.

Parameters:

type_defs_line – The line to import the type definitions module. Example: "from boto3_dataclass.tests.gen_code import type_defs"