咨询可自动为[deprecated=true]字段生成Python弃用警告的Protobuf编译器
针对Protobuf
deprecated=true标签自动生成Python弃用警告的方案 原生Protobuf编译器(protoc)默认不会在生成的Python代码中,为标记了[deprecated = true]的字段自动添加弃用警告。不过你可以通过以下方案实现需求,比当前的猴子补丁更简洁可靠:
自定义Protoc插件(最优解)
Protoc支持通过插件扩展代码生成逻辑,你可以编写一个Python插件,在解析.proto文件时识别带有deprecated=true标签的字段,然后在生成对应Python代码时自动插入warnings.warn语句。比如在字段的setter方法、初始化赋值逻辑中加入警告代码,这样用户使用废弃字段时,运行时会直接触发警告,无需额外的运行时补丁操作。基于Descriptor的运行时检测(轻量替代方案)
如果你暂时不想开发插件,可以利用Protobuf的Descriptor机制替代猴子补丁:遍历消息类的字段描述符,筛选出标记为废弃的字段,然后为消息类添加自定义的__setattr__方法,当赋值给废弃字段时触发警告。这种方式无需修改生成的源码,维护性比猴子补丁更好。示例代码如下:import warnings from google.protobuf.descriptor import FieldDescriptor def add_deprecation_warnings(message_cls): original_setattr = message_cls.__setattr__ deprecated_fields = { field.name for field in message_cls.DESCRIPTOR.fields if field.deprecated } def new_setattr(self, name, value): if name in deprecated_fields: warnings.warn( f"Field '{name}' is deprecated", DeprecationWarning, stacklevel=2 ) original_setattr(self, name, value) message_cls.__setattr__ = new_setattr使用时只需在你的Protobuf消息类上调用
add_deprecation_warnings(YourMessageClass)即可。
内容的提问来源于stack exchange,提问作者Wilf Somogyi
相关产品推荐
相关产品推荐

