拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Apache Arrow PyArrow 开发实战指南:代码风格、pytest 测试分组、类型检查与跨语言调试

Apache Arrow PyArrow 开发实战指南代码风格、pytest 测试分组、类型检查与跨语言调试【免费下载链接】arrowApache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics项目地址: https://gitcode.com/GitHub_Trending/arrow3/arrow本篇指南聚焦 Apache Arrow 仓库中 PyArrowPython 绑定的日常开发流程如何用 pre-commit 统一代码风格、如何用 pytest 及其自定义的测试分组开关精确控制测试范围、如何运行 mypy/pyright/ty 三种类型检查器并维护类型桩stubs、如何用 doctest 校验文档示例以及如何通过 gdb/lldb 在 Python 与 Arrow C 共享库之间交叉调试。读完并动手实践后你将具备独立构建、测试、检查与调试 PyArrow 的完整开发能力。一、代码风格与 pre-commit 自动修复PyArrow 遵循与 pandas 项目类似的 PEP8 风格。仓库使用 pre-commit 配置 管理所有语言 Lint 钩子文档给出的标准修复命令是$ pre-commit run --show-diff-on-failure --coloralways --all-files python末尾的python是钩子别名。从.pre-commit-config.yaml的源码结构看alias: python对应的钩子包括钩子作用适用文件autopep8Python Format自动格式化全局配置取自python/setup.cfgc_glib/、dev/、python/下的 Python 与 Cython 文件flake8Python Lint静态检查配置同样来自python/setup.cfg同上cython-lintPython (Cython) LintCython 代码 Lint--no-pycodestylepython/clang-formatPython (C) Format格式化绑定层 C 代码排除 gRPC/protobuf 生成文件python/pyarrow/src/numpydoc-validationPython (NumPy doc) Lint校验 docstring 是否符合 NumPy 规范python/pyarrow/排除tests/、vendored/等首次使用前需安装pre-commit并执行一次pre-commit install注册 git 钩子配置文件头部注释有说明。--all-files表示忽略 git 暂存区、对全部文件运行钩子适合在新克隆或批量修改后统一整改。二、运行单元测试PyArrow 的测试套件基于 pytest。按照文档 building.rst 构建项目之后可在仓库根目录执行$ pushd arrow/python $ python -m pytest pyarrow $ popd2.1 测试依赖运行单元测试所需的第三方包清单在 python/requirements-test.txt可按需安装$ pip install -r requirements-test.txt当前清单包括cffi、hypothesis、packaging、pytest、pytest-xdist、pytz、pyuwsgi仅非 Windows 且 Python 3.13以及按 Python 版本区分要求的pandasPython 3.15 要求pandas3.1.0.dev0。python/requirements-wheel-test.txt 则用于 wheel 发布验证其中对 numpy 版本做了逐 Python 版本钉住如numpy~2.0.0对应 Python ≤ 3.12、numpy~2.3.3对应 3.14。此外 python/pyproject.toml 定义了dependency-groups中的test依赖组pytest、hypothesis、cffi、pytz、pandas并声明requires-python 3.11、构建后端为 scikit-build-corecython 3.1、numpy2.0。如果运行测试时出现pyarrow._lib或其他 PyArrow 模块的导入错误文档建议改用python -m pytest arrow/python/pyarrow运行并检查可编辑安装editable install是否正确——这类错误通常意味着扩展模块没有被正确构建或安装到当前环境。2.2 自定义命令行选项与测试分组测试套件提供了一套自定义的 pytest 命令行选项。查看全部选项$ python -m pytest pyarrow --help输出中查找 custom options 部分即可。这些选项的注册逻辑在 python/pyarrow/tests/conftest.py 的pytest_addoption中对每个分组同时注册--enable-group与--disable-group两个布尔开关并且默认值可以先从PYARROW_TEST_GROUP环境变量读取支持1/true/on/yes/y与0/false/off/no/n未设置时才回落到内置默认值。注意文档还提到可用--only-group如--only-parquet只运行某一组测试。但从当前仓库源码结构看conftest 中只注册了--enable-*/--disable-*选项--only-*并未在 conftest 中出现实操时请以python -m pytest pyarrow --help的输出和当前仓库状态为准。分组的内置默认值定义在 python/pyarrow/conftest.py 的groups与defaults两个列表中当前仓库共有 33 个分组。默认开关的判定逻辑可以概括为三类能力探测型如brotli/bz2/gzip/lz4/snappy/zstd取决于Codec.is_available()threading取决于is_threading_enabled()导入探测型如dataset、orc、parquet、parquet_encryption、flight、azure、gcs、s3、hdfs、acero、substrait等在对应的pyarrow.xxx模块可导入时才启用gandiva、pandas、numpy亦采用 try-import 判定且pandas/numpy导入失败时会自动启用反向组nopandas/nonumpy固定关闭型如large_memory、slow、processesEmscripten 下为 False、memory_leak等需要显式开启的组。文档重点列举的分组包括datasetArrow Dataset、flightFlight RPC、gandiva表达式编译器依赖 LLVM自 24.0.0 起已废弃、hdfslibhdfs 访问 Hadoop 文件系统、hypothesis随机用例生成注意--hypothesis因 pytest 的一个怪癖不可用必须传--enable-hypothesis、large_memory需要大内存、orc、parquet、s3。启用/禁用示例$ python -m pytest pyarrow --parquet # 启用 parquet 组即 --enable-parquet 的简写用法 $ python -m pytest pyarrow --disable-parquet分组最终如何生效见 python/pyarrow/tests/conftest.pypytest_configure计算is_enabled[mark] enable_flag and not disable_flag并注册同名 pytest markerpytest_runtest_setup在每条用例执行前检查其标记未启用则调用pytest.skip({group} NOT enabled)。因此带pytest.mark.parquet标记的测试在未启用该组时会被自动跳过而不是报错。文档中列举的tensorflow分组未出现在当前groups列表中同样以当前仓库为准。2.3 hypothesis 随机测试带pytest.mark.hypothesis的用例依赖 hypothesis 库。python/pyarrow/tests/conftest.py 注册了三套 hypothesis profilecimax_examples1000devmax_examples50默认HYPOTHESIS_PROFILE未设置时加载debugmax_examples10且开启详细输出查看随机生成的用例可运行$ pytest pyarrow -sv --enable-hypothesis --hypothesis-profiledebug2.4 C 层低层测试的 pytest 封装仓库中有一部分低层测试直接以 C 编写位于 python/pyarrow/src/arrow/python/python_test.cc。它们通过 python/pyarrow/tests/test_cpp_internals.py 这个 pytest 测试模块被包装并自动纳入 PyArrow 测试套件统一运行因此开发 C 绑定层时同样可以在 pytest 中验证行为。测试数据feather、orc、parquet 样例文件位于 python/pyarrow/tests/data。三、静态类型检查PyArrow 提供类型桩*.pyi文件支持静态类型检查桩文件存放在 python/pyarrow-stubs 目录镜像主包pyarrow/的结构当前仓库中已有 pyarrow/init.pyipyarrow/目录下的 py.typed 标记文件按 PEP 561 向类型检查器声明包支持类型检查。3.1 三种受支持的类型检查器三种检查器的配置都集中在 python/pyproject.tomlmypy$ cd arrow/python $ mypy对应[tool.mypy]段files [pyarrow-stubs]、mypy_path指向pyarrow-stubs并排除pyarrow/、benchmarks/、examples/、scripts/。pyright$ cd arrow/python $ pyright对应[tool.pyright]段pythonVersion 3.11、include [pyarrow-stubs]、stubPath pyarrow-stubs、typeCheckingMode basic。ty$ cd arrow/python $ ty check对应[tool.ty.environment]的extra-paths [pyarrow-stubs]与[tool.ty.src]的 include/exclude 配置文档注明 ty 目前仅为部分配置。从pyproject.toml中三处配置上方一致的 TODO 注释Enable type checking once stubs are merged以及构建配置 python/pyproject.toml 的注释可以看出当前仓库处于类型桩迁移的过渡期——wheel.exclude [pyarrow/py.typed]暂时将 PEP 561 标记与不完整的.pyi文件排除在 wheel 之外避免下游用户的检查器依赖不完整桩而报错而py.typed仍保留在源码树中供 CI 做类型检查。桩文件最终会在构建过程中自动复制到 wheel 中随包分发届时下游项目与 IDE 即可获得完整的类型支持。3.2 维护类型桩的三步流程当新增或修改公共 API 时更新对应的.pyi桩文件位于pyarrow-stubs/反映新函数/类签名的变化尽量补充类型注解对 Cython 模块或 compute 内核这类动态生成的 API在pyarrow-stubs/中补充对应桩运行类型检查器确认桩的正确性与完整性。四、Doctest让文档示例可执行PyArrow 使用 doctest 保证 docstring 中的示例始终是正确且最新的。4.1 对 Python 源码文件$ pushd arrow/python $ python -m pytest --doctest-modules $ python -m pytest --doctest-modules path/to/module.py # 只检查单个文件 $ popd4.2 对 Cython 源码文件$ pushd arrow/python $ python -m pytest --doctest-cython $ python -m pytest --doctest-cython path/to/module.pyx # 只检查单个文件 $ popd检查.pyx与.pxi文件时需要安装pytest-cython插件。一个容易踩坑的细节Cython 的.pxi文件在编译期被包含进.pyx文件因此--doctest-cython无法直接对.pxi文件运行。PyArrow 中所有.pxi都被包含进 pyarrow/lib.pyx所以对.pxi中的示例运行 doctest 的方式是$ python -m pytest --doctest-cython path/to/lib.pyx此时源自.pxi的报错会显示在lib.pyx名下而不是原.pxi文件名。4.3 conftest 如何支撑 doctestpython/pyarrow/conftest.py 为 doctest 做了三件关键工作pytest_ignore_collect跳过pyarrow/tests/目录对dataset、orc、parquet、flight、substrait等可选模块若对应组件未构建则整体忽略其 doctest 收集pyarrow/fs在未编译 S3 文件系统时同样跳过_docdir自动夹具doctest 期间将工作目录切换进 pytest 的tmpdir使示例中生成的输出文件不会污染仓库add_fs夹具向doctest_namespace注入fs、localLocalFileSystem 实例、path/local_path等名字供fs模块 docstring 中的示例直接使用。4.4 测试文档.rst中的示例docs/source/python/下.rst文档中的示例同样采用 doctest 语法提示符、...续行可以本地验证$ pushd arrow/python $ pytest --doctest-glob*.rst docs/source/python/file.rst # 单个文件 $ pytest --doctest-glob*.rst docs/source/python # 整个目录 $ popd示例中创建文件的临时目录处理由 docs/source/python/conftest.py 中的夹具自动完成。五、调试跨越 Python 与 C 共享库由于 PyArrow 依赖 Arrow C 库调试经常需要在 Python 与 C 共享库之间来回跨越。为了获得最佳体验文档要求两侧都使用 Debug 模式构建Arrow CCMake 构建时加-DCMAKE_BUILD_TYPEDebugPyArrowpip install --no-build-isolation -C cmake.build-typeDebug .。5.1 Linux 上使用 gdb先用 gdb 拉起 pytest只运行目标测试$ gdb --args python -m pytest pyarrow/tests/test_to_run.py -k $TEST_TO_MATCH断点语法与调试 C 程序完全相同。由于目标函数位于尚未加载的共享库中gdb 会询问是否为将来的库加载挂起断点(gdb) b src/arrow/python/arrow_to_pandas.cc:1874 No source file named src/arrow/python/arrow_to_pandas.cc. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 1 (src/arrow/python/arrow_to_pandas.cc:1874) pending.macOS 上则改用 lldb流程相同。调试 C 层时还可以配合仓库提供的 GDB 扩展 cpp/gdb_arrow.py即 Arrow C 文档中提到的 GDB extension for Arrow C获得针对 Arrow 数据结构的友好打印。六、基准测试与延伸阅读PyArrow 的性能基准测试有独立的文档与工具链官方文档中的 Benchmarking 一节直接指向 benchmarks 参考章节python/benchmarks/目录存放着基准脚本。开发流程的其余部分——环境搭建、构建参数与构建选项——请参阅同目录下的构建文档 docs/source/developers/python/building.rst。要点回顾PyArrow 开发闭环 pre-commitpython别名钩子统一风格 →python -m pytest pyarrow加--enable-*/--disable-*或PYARROW_TEST_*环境变量精确控制 33 个测试分组 → mypy/pyright/ty 三种检查器配合pyarrow-stubs/做静态类型检查 →--doctest-modules/--doctest-cython/--doctest-glob分别校验.py、.pyx/.pxi与.rst中的示例 → 双端 Debug 构建后用 gdb/lldb 跨语言打断点。所有开关的权威定义均可在 python/pyarrow/tests/conftest.py 与 python/pyarrow/conftest.py 中核对。【免费下载链接】arrowApache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics项目地址: https://gitcode.com/GitHub_Trending/arrow3/arrow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门