Daft 类型转换完全指南:DataType 与 Python 类型之间的双向映射机制

发布时间:2026/9/17 4:09:00

Daft 类型转换完全指南:DataType 与 Python 类型之间的双向映射机制 Daft 类型转换完全指南DataType 与 Python 类型之间的双向映射机制【免费下载链接】DaftHigh-performance data engine for AI and multimodal workloads. Process images, audio, video, and structured data at any scale项目地址: https://gitcode.com/GitHub_Trending/da/Daft本文围绕 Daft 官方文档 Type Conversions 展开系统讲解 Daft DataType 与 Python 类型之间的双向转换规则Daft 到 Python 的取值映射如Series.to_pylist、Python 类型到 Daft 类型的静态推断如daft.func的返回类型提示、以及基于 Python 对象字面值的运行时推断如daft.from_pydict。读完本文你将能够准确预测任意 Python 类型/对象在 Daft 中被映射为哪种 DataType也能结合 daft/datatype.py 的源码实现理解各推断分支的边界条件与警告行为。Daft 到 Python取值时的类型映射当你从 Daft 数据中取出 Python 值时典型场景包括 [Series.to_pylist][daft.series.Series.to_pylist]、将列 [cast][daft.expressions.Expression.cast] 到 Python 类型、以及传递给daft.func装饰函数的参数Daft DataType 按如下规则映射为 Python 类型Daft DataTypePython TypeNullNoneBooleanboolUtf8strBinaryFixedSizeBinarybytesInt8Uint8Int16UInt16Int32UInt32Int64UInt64intTimestampdatetime.datetimeDatedatetime.dateTimedatetime.timeDurationdatetime.timedeltaIntervalnot supportedFloat32Float64floatDecimal128decimal.DecimalList[T]FixedSizeList[T, n]list[T]Struct[k1: T1, k2: T2, ...]{ k1: T1, k2: T2, ... }Map[K, V]list[tuple[K, V]]默认maps_as_pydicts下为dict[K, V]Tensor[T]FixedShapeTensor[T, [...]]numpy.typing.NDArray[T]SparseTensor[T]FixedShapeSparseTensor[T, [...]]{values: T,indices: [int],shape: [int]}Embedding[T]numpy.typing.NDArray[T]Imagenumpy.typing.NDArray[numpy.uint8 \| numpy.uint16 \| numpy.float32]PythonAnyExtension[T]T从源码结构看上述行为对应 Rust 侧impl IntoPyObject for Literal的实现入口位于 src/daft-core/src/lit/python.rs文档中的注释即要求该表与 Rust 的Literal转 Python 对象行为保持一致。Map 类型的两种取值模式maps_as_pydicts对Map[K, V]列取 Python 值时Daft 默认转换为list[tuple[K, V]]关联列表目的是保留重复键与键的顺序。若希望得到 Pythondict可在Series.to_pylist等接口上传入maps_as_pydicts参数maps_as_pydictslossy遇到重复键时保留最后一个值并发出警告maps_as_pydictsstrict遇到重复键时直接抛出异常。该参数在 Python 层的签名与文档位于 daft/series.py#L231-L241底层由self._series.to_pylist(maps_as_pydicts)转发给 Rust 实现完成实际转换。选择建议如果下游逻辑依赖每个键唯一的 dict 语义且能容忍静默丢失用lossy如果数据源保证键唯一、或需要尽早暴露脏数据用strict更稳妥。Python 类型到 Daft静态类型推断当 Daft 需要根据Python 类型而非具体值推导 DataType 时——例如从daft.func装饰函数的类型注解推断返回列的类型——使用的是DataType.infer_from_type类方法。你可以直接调用它来验证任意 Python 类型的推断结果Python TypeDaft DataTypeNoneTypeNullboolBooleanstrUtf8bytesBinaryintInt64floatFloat64datetime.datetimeTimestamp[us]datetime.dateDatedatetime.timeTime[us]datetime.timedeltaDuration[us]list[T]List[T]dict[K, V]Map[K, V]typing.TypedDict(..., { k1: T1, k2: T2, ... })Struct[k1: T1, k2: T2, ...]tuple[T0, T1, ..., TN]实际类型中不含省略号Struct[_0: T0, _1: T1, ..., _N: TN]tuple[T, ...]List[T]带序列化字段f1: T1,f2: T2, ... 的pydantic.BaseModelStruct[f1: T1, f2: T2, ...]numpy.ndarraytorch.Tensortensorflow.Tensorjax.Arraycupy.ndarrayTensor[Python]numpy.typing.NDArray[T]Tensor[T]torch.FloatTensorTensor[Float32]torch.DoubleTensorTensor[Float64]torch.ByteTensorTensor[UInt8]torch.CharTensorTensor[Int8]torch.ShortTensorTensor[Int16]torch.IntTensorTensor[Int32]torch.LongTensorTensor[Int64]torch.BoolTensorTensor[Boolean]jaxtyping类型见下文 jaxtyping 小节Tensor 或 FixedShapeTensornumpy.bool_Booleannumpy.int8Int8numpy.uint8UInt8numpy.int16Int16numpy.uint32/numpy.uint64等对应 numpy 整型UInt32 / UInt64 等numpy.float32Float32numpy.float64Float64numpy.datetime64Timestamp[us]pandas.SeriesList[Python]PIL.Image.ImageImage[MIXED]daft.SeriesList[Python]其他所有类型Python推断实现的关键分支源码解读infer_from_type的完整实现位于 daft/datatype.py#L183-L404其中几个容易被忽略的分支值得注意Union 类型先对 Union 的每个成员递归推断。若所有成员推断出同一种 DataType则取之若是Optional[X]即Union[NoneType, X]则退化为X否则兜底为Python类型。TypedDict 与 dict 的区别dict[K, V]推断为Map[K, V]因为仅从类型上无法得到具体的字段名而TypedDict的键是已知的因此能推断为Struct。源码中若发现 TypedDict 的键不是字符串会降级为Map[Python, Python]并告警。tuple 的两种形态tuple[int, str]这类定长元组映射为Struct[_0: ..., _1: ...]字段名为自动生成的下标而tuple[T, ...]带省略号的无限元组则映射为List[T]。Pydantic V2 支持对pydantic.BaseModel的推断仅支持 Pydantic V2源码中显式校验2.0.0 version 3.0.0并按model_config的serialize_by_alias决定 Struct 字段名取别名还是属性名同时会把model_computed_fieldscomputed field也纳入 Struct 字段。Tensor 类型族的精确匹配torch的 7 种具名 Tensor 子类各自映射到对应 dtype而泛化的torch.Tensor、tensorflow.Tensor、jax.Array、cupy.ndarray由于无法在类型层面得到 dtype统一推断为Tensor[Python]。numpy 侧NDArray[T]的第二个类型参数会被解出并映射为内层 dtype解不出来时告警并回退Tensor[Python]。无法静态推断的兜底decimal.Decimal类型无法从类型得到 precision/scale、裸的pandas.Series、daft.Series都会发出警告并回退为Python或List[Python]表外的任意类型一律落到Python类型分支。jaxtyping从注解中推断 dtype 与 shapejaxtyping 库为 NumPy、PyTorch、TensorFlow、JAX 的数组类型提供 dtype 与 shape 注解。Daft 可以原生解析jaxtyping注解同时推断出张量的内层 dtype 和形状。对应实现是 daft/datatype.py 中的_infer_from_jaxtyping。示例jaxtyping.Float64[jaxtyping.Array, 1 2 3 4]→FixedShapeTensor[Float64, [1, 2, 3, 4]]jaxtyping.Int8[torch.Tensor, dim1 dim2]→Tensor[Int8]Dtype 推断jaxtyping TypeDaft DataTypeBoolBooleanInt8Int8UInt8UInt8Int16Int16UInt16UInt16Int32Int32UInt32UInt32Int64IntIntegerInt64UInt64UIntUInt64Float32Float32Float64FloatRealFloat64Everything elsePython注这里得到的 DataType 是结果Tensor/FixedShapeTensor的内层类型。Shape 推断jaxtyping类型的第二个泛型参数是一个空格分隔的符号字符串表示数组形状。Daft 的推断策略与源码中仅当所有维度都是固定值_FixedDim时才写入 shape的逻辑一致若所有维度均为固定尺寸推断为FixedShapeTensor例如1 2 3、rows4 cols3、标量形状否则推断为Tensor例如dim1 dim2、512 512 _、... 1 2 3。Python 对象到 Daft运行时值推断除了上表的类型级映射Daft 在未显式指定类型、直接把 Python 对象转换为 Daft 列时典型场景daft.from_pydict、Series.from_pylist还能从对象的具体值中提取类型信息得到比纯类型推断更精确的 DataType。对应方法为DataType.infer_from_object——其实现是通过Series.from_pylist([obj])构造单元素 Series 再读取其datatype()因此你可以用同一入口验证任意对象的推断结果。在类型级映射的基础上对象级推断有以下额外行为Python ObjectDaft Type大于 2^63-1Int64 最大值的int值UInt64形如{ k1: T1, k2: T2, ... }的dictStruct[k1: T1, k2: T2, ...]小数点后 N 位的decimal.DecimalDecimal128[precision38, scaleN]元素类型为T的pandas.SeriesList[T]元素类型为T的daft.SeriesList[T]带有 numpy dtypeT的numpy.ndarray/torch.Tensor/tensorflow.Tensor/jax.Array/cupy.ndarrayTensor[T]单位为U的numpy.datetime64U Y、M、W、D 时为 DateU h、m、s 时为 Timestamp[s]U ms 时为 Timestamp[ms]U us 时为 Timestamp[us]U ns、ps、fs、as 时为 Timestamp[ns]模式为M的PIL.Image.Image支持的模式L、LA、RGB、RGBAImage[M]可以看到对象级推断的核心价值在于利用运行时信息收紧类型dict的键值对能落成具体字段的 Struct 而非 MapDecimal能定出 scaledatetime64能按单位精细区分 Date/Timestamp 及各精度PIL 图像能保留具体通道模式。这与Python 到 Daft一节中dict只能推断为Map[K, V]、PIL.Image.Image只能推断为Image[MIXED]形成了清晰对照——类型层面看不到键名和值范围对象层面可以。实践建议写 UDF 时优先声明类型注解daft.func的返回类型注解会走infer_from_type路径直接决定输出列的 DataType。给张量返回值使用jaxtyping或具名 torch Tensor 类型可以获得带 dtype甚至带 shape的 Tensor 列而不是宽泛的Tensor[Python]。需要精确类型时用cast显式声明对象级推断无法覆盖的场景如混合类型列表应通过 [Expression.cast][daft.expressions.Expression.cast] 显式指定目标类型而不是依赖推断。取 Map 列值前先确认键唯一性默认list[tuple[K, V]]是最安全的形式只有确认数据干净或可接受覆盖语义时再使用maps_as_pydictslossy/strict换取 dict 便利性。验证推断结果怀疑某个注解/对象推断结果时直接调用DataType.infer_from_type/DataType.infer_from_object打印结果即可二者行为与转换管线保持一致。参考类型转换规则原文档docs/api/datatypes/type_conversions.mdPython 类型推断实现daft/datatype.pyinfer_from_type、_infer_from_jaxtyping、infer_from_objectto_pylist与maps_as_pydictsdaft/series.pyRust 侧字面量转 Python 的实现src/daft-core/src/lit/python.rs【免费下载链接】DaftHigh-performance data engine for AI and multimodal workloads. Process images, audio, video, and structured data at any scale项目地址: https://gitcode.com/GitHub_Trending/da/Daft创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/17 4:04:00

手机SoC性能天梯怎么看?从制程、架构到持续性能的选购避坑指南

拖了快两个月,这版“性能天梯”总算更新完了。期间有朋友催问为什么这么久,原因很实在——这次没有停留在“谁跑分高谁排前”的粗浅逻辑,而是把范围从旗舰机扩到了在售主流百款机型,重新梳理了SoC芯片的性能基准、功耗表现和实际体…

2026/9/17 4:04:00

2026年广州房屋防水补漏怎么选?施工前这几个问题要问清

广州的防水补漏市场,水挺深。同一个小漏点,有人报三百,有人报三千,还有人拍着胸脯说“包十年不漏”,转头第二年就找不到人。价格差这么多,不是行情乱,是漏点没查清就报价,报的自然是…

2026/9/17 4:59:02

FANUC PMC编程核心:地址体系、梯形图互锁与调试排错

简介:面向数控机床电气调试、维修与自动化控制岗位的《FANUC数控系统PMC编程说明书(非常详细)》,围绕BEIJING-FANUC PMC的PA1、SA1、SA3机型展开,适合已具备梯形图基础、希望系统掌握PMC编程逻辑的工程师查阅。内容从P…

2026/9/17 4:59:02

Android 平板做车用诊断仪:ELM327 与 OBD-II 协议实战

简介:这份资源是一篇面向Android客户端应用开发方向的学术参考文献,适合汽车电子、嵌入式开发与移动应用开发者阅读,用于解决传统车用诊断仪软硬件自成体系、通用性不足的问题。文章提出以Android移动设备为诊断平台,借助蓝牙模块…

2026/9/17 4:59:02

混合动力汽车VCU控制策略与工程实践

1. 混合动力汽车VCU控制策略概述混合动力汽车整车控制器(VCU)作为车辆能量管理的"大脑",其控制策略直接决定了整车的动力性、经济性和驾驶舒适性。在工程实践中,基于规则的控制方法因其可靠性和实时性优势,成…

2026/9/17 4:59:02

企业软件批量安装全攻略:从GPO、SCCM到Python离线部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/17 4:54:01

CISCN 2019 en_2:从栈溢出到栈迁移的CTF PWN实战

1. 题目初印象:一道看着基础、实则藏坑的PWN题CISCN 2019华北赛区的这道ciscn_2019_en_2,在PWN方向算是比较经典的一道栈迁移入门题。很多人第一次拿到它,会觉得“这不就是个溢出的简单题嘛”,结果真动手做才发现,里面…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码