ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Magika Python 包 0.6.0 的 API 破坏性变更有哪些,旧代码怎么迁移

Magika Python 包 0.6.0 的 API 破坏性变更有哪些,旧代码怎么迁移 Magika Python 包 0.6.0 的 API 破坏性变更有哪些旧代码怎么迁移【免费下载链接】magikaFast and accurate AI powered file content types detection项目地址: https://gitcode.com/GitHub_Trending/ma/magika如果你在已有代码里使用了 magika 的 Python 模块做文件类型识别升级到magika 0.6.0时可能会遇到字段访问失败、弃用警告甚至识别结果发生变化。这篇文章基于仓库中的 python/CHANGELOG.md 与 python/README.md说明 0.6.0 的破坏性变更有哪些、旧代码要改哪些字段以及如何验证迁移完成。先给两个背景事实均来自 python/CHANGELOG.md项目约定版本号以0开头的0.x.yx的 bump 应被视为 major即可能有 breaking change。0.6.0 就属于这种情况。CHANGELOG 目前记录到的 0.6.0 系列版本是0.6.0-rc32024-11-20。升级与安装按 python/README.md 的说明magika 在 PyPI 上以magika发布$ pip install magika安装特定版本包括作为 release candidate 发布的版本$ pip install magika0.6.0rc1如果你只用命令行、不把它作为 Python 模块README 建议使用pipx install magika。升级完成后可以用随包提供的 CLI 确认当前版本$ magika -V0.6.0起Python 包里附带的是用 Rust 重写的新 CLI替代旧的 Python CLI模块 API 与 CLI 的输出结构都发生了变化。破坏性变更返回值类型与字段访问1. 识别结果包在 MagikaResult 里Magika对象暴露三个方法见 python/README.mdmagika.identify_bytes(btest)输入字节流magika.identify_path(Path(test.txt))输入一个Pathmagika.identify_paths([...])输入Path列表逐个返回。这三个方法现在返回MagikaResult一个类似absl::StatusOr的对象内部包装MagikaPrediction。设计目的是在有效预测和错误情况之间做清晰区分。主要类型结构摘自 README 与源码class MagikaResult: path: Path status: Status prediction: MagikaPrediction [...]class MagikaPrediction: dl: ContentTypeInfo output: ContentTypeInfo score: floatclass ContentTypeInfo: label: ContentTypeLabel mime_type: str group: str description: str extensions: List[str] is_text: boolStatus的取值定义在 python/src/magika/types/status.pyOK、FILE_NOT_FOUND_ERROR路径不存在、PERMISSION_ERROR存在但读不了、UNKNOWN。identify_bytes没有代码路径返回错误见magika_result.py中的注释但identify_path/identify_paths会。迁移时凡是原来直接假设拿到的一定是预测的用法现在应先判断结果是否 ok再取预测from magika import Magika m Magika() res m.identify_path(Path(doc.json)) if not res.ok: print(res.status) raise SystemExit(1) print(res.output.label)2. ct_label 与 magic 字段弃用python/CHANGELOG.md 对 0.6.0-rc1 的记录dl.ct_label和output.ct_label弃用改为dl.label和output.label。label的类型是ContentTypeLabel一个StrEnum可当字符串用。magic元数据弃用改用description。在源码层面旧字段仍然可用但会触发DeprecationWarning见 python/src/magika/types/content_type_info.py访问.ct_label的警告文案\.ct_label is deprecated and will be removed in a future version. Use .label instead.访问.magic的警告文案\.magic is deprecated and will be removed in a future version. Use .description instead.因此旧代码的字段替换是直接的# 旧写法触发 DeprecationWarning未来版本会移除 ct res.output.ct_label desc res.output.magic # 0.6.0 写法 ct res.output.label # ContentTypeLabel可当字符串用 desc res.output.description3. score 不再挂在 dl / output 上旧文档里dl.score/output.score的用法在 0.6.0 中会直接抛AttributeError而不是返回数值。python/src/magika/types/content_type_info.py 中.score属性的报错信息原文是Unsupported field error:.score.is not stored anymore in thedloroutputobjects; it is now stored inMagikaResult.也就是说置信度分数现在存放在MagikaResult上MagikaPrediction.score迁移方式# 旧写法会抛 AttributeError score res.dl.score # 0.6.0 写法 score res.scoreMagikaResult还提供了转发属性res.dl、res.output、res.score多数场景不需要写完整的res.prediction.output路径magika_result.py中注释说明这是为了优化高频正常路径。4. 深学习模型未触发时 dl 的行为变了CHANGELOG 原文When the deep learning model is not used,dl.labelis nowContentTypeLabel.UNDEFINED, rather than setting the fulldlfield toNone.docs/magika_output.md 补充了一个具体条件文件太小当前小于 16 字节时不会使用深学习模型此时dl块的label为ContentTypeLabel.UNDEFINED。如果你旧代码里有类似if res.dl is None: ...的判断现在需要改为判断dl.label是否等于UNDEFINEDfrom magika.types import ContentTypeLabel if res.dl.label ContentTypeLabel.UNDEFINED: # 深学习模型未参与预测 ...5. 内容类型元数据新增字段0.6.0 起内容类型元数据包含is_text布尔值预测的内容类型是否为文本类和extensions与该内容类型通常关联的文件扩展名列表。旧代码不受影响新代码可以直接使用。6. 默认模型换成 standard_v2_1识别结果可能不同CHANGELOG 记录模块底层换了一个新模型支持 200 多种内容类型建议核对新支持的内容类型列表并更新所有依赖特定识别结果的代码该模型比旧模型读取的输入字节更多速度略慢。当前源码中默认模型名为standard_v3_0见 python/src/magika/magika.py 中的DEFAULT_MODEL_NAME如果你显式指定过模型目录注意模型目录名与版本的对应关系。这一项属于结果兼容性变更即使你的代码一行不改、也不再有字段报错针对某些文件的识别结论也可能和旧版本不同需要按新模型的输出重新核对依赖特定 label 的业务逻辑。CLI JSON 输出的变化如果你解析命令行 JSON0.6.0-rc1 起 JSON 输出由 Rust 客户端产生CHANGELOG 记录的结构差异score字段与dl、output同级不再位于dl.score和output.score输出新增is_text预测内容类型是否文本类和extensions关联扩展名列表。--json输出示例来自 docs/magika_output.md示例结果{ path: tests_data/basic/javascript/code.js, result: { status: ok, value: { dl: { description: JavaScript source, extensions: [js, mjs, cjs], group: code, is_text: true, label: javascript, mime_type: application/javascript }, output: { label: javascript, ...: 同 dl 块结构 }, score: 0.9710000157356262 } } }如果你有解析旧 JSON 结构的脚本同样要把取分数的路径从result.dl.score/result.output.score改为result.value.score。验证迁移是否完成在 python/README.md 给出的最小示例上跑一遍 0.6.0 的模块用法 from magika import Magika m Magika() res m.identify_bytes(b# Example\nThis is an example of markdown!) print(res.output.label) markdown预期打印markdown。用仓库自带的测试文件如 tests_data/basic/python/code.py调用identify_path检查res.ok为真、res.output.label为python、res.score可正常读取。README 中给出了该文件的--jsonCLI 示例输出文档示例其中score为0.753000020980835可用于对照命令行侧输出结构。搜索你项目代码中所有的.ct_label、.magic、dl.score、output.score、is None对dl字段的判断替换为上文对应的 0.6.0 写法。README 的说明是在能保留旧 API 的地方都保留了支持并加了弃用警告因此迁移后如果仍有DeprecationWarning打印说明还有旧字段访问未清理访问.score则不会再有警告而是直接抛AttributeError属于必须修改的项。跑一遍依赖具体识别结论的逻辑确认新模型200 内容类型下的结果符合预期这是 CHANGELOG 明确提示需要update any code depending on specific results的部分。限制与边界CHANGELOG 中 0.6.0 系列只记录到0.6.0-rc3python/README.md 开头也标注该 README 描述的是即将发布的 0.6.0写作时为0.6.0rc2。安装时请确认自己实际拉到的版本本文所有断言以 CHANGELOG 与仓库内文档为准。新模型比旧模型读取的输入字节更多、速度略慢。CHANGELOG 说明项目方有更小但精度略低的模型如果你的场景对输入字节量或速度敏感作者建议直接联系项目方反馈需求。本文只覆盖 Python 模块 API 与 CLI JSON 输出层面的变更standard_v1等旧模型的细节如magika_config.json、thresholds.json在 assets_generation/models/standard_v1/ 下有对应文件旧版本 README 已随 0.6.0 重写仓库内的 python/CHANGELOG.md 保留了各版本的变更记录可用来回溯 0.5.x 的行为。【免费下载链接】magikaFast and accurate AI powered file content types detection项目地址: https://gitcode.com/GitHub_Trending/ma/magika创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表