python从已实现的模块中回溯(反向)protobuf获得.proto

前提:已经有_p2.py文件(通常是别人实现的,自己没有.proto文件,但需要修改)

from logPrt import logPrt
import message_pb2

'''
  TYPE_DOUBLE         = 1
  TYPE_FLOAT          = 2
  TYPE_INT64          = 3
  TYPE_UINT64         = 4
  TYPE_INT32          = 5
  TYPE_FIXED64        = 6
  TYPE_FIXED32        = 7
  TYPE_BOOL           = 8
  TYPE_STRING         = 9
  TYPE_GROUP          = 10
  TYPE_MESSAGE        = 11

'''

typeStr = ['double','float','int64','uint64','int32','fixed64','fixed32','bool','string','group','message','bytes']

def printSubStructure(vs,ts):
    #vs = subObj.DESCRIPTOR
    logPrt.logWarn(f"{ts}message {vs.name}" + '{')


    for typevo in vs.nested_types:
        printSubStructure(typevo,ts+'\t')

    for field in vs.fields:
        if hasattr(field,'index'):
            if hasattr(field,'name') and hasattr(field,'type'):
                pstr = f'{ts}\t'
                if field.label == 3:
                    pstr += 'repeated '
                if field.message_type == None:
                    pstr += f"{typeStr[field.type-1]} {field.name} = {field.index + 1};"
                else:
                    typeObj = field.message_type
                    pstr += f"{typeObj.name} {field.name} = {field.index + 1};"
                
                logPrt.logWarn(pstr)
        else:
            printSubStructure(field,ts+'\t')
    logPrt.logWarn(ts+'}')
    

def print_class_structure(module):
    for name, obj in module.__dict__.items():
        if not hasattr(obj,'DESCRIPTOR'):
            continue

        logPrt.logCyan(f"message {name}" + '{')
        if hasattr(obj,'__dict__'):
            vars = obj.__dict__.items()
            for s,o in vars:
                if hasattr(o,'DESCRIPTOR'):
                    descriptor = o.DESCRIPTOR
                    if hasattr(descriptor,'index'):
                        pstr = '\t'
                        if descriptor.label == 3:
                            pstr += 'repeated '
                        if hasattr(descriptor,'name') and hasattr(descriptor,'type'):
                            
                            if descriptor.message_type == None:
                                pstr += f"{typeStr[descriptor.type-1]} {descriptor.name} = {descriptor.index + 1};"
                            else:
                                typeObj = descriptor.message_type
                                pstr += f"{typeObj.name} {descriptor.name} = {descriptor.index + 1};"
                            
                            logPrt.logMred(pstr)
                    else:
                        printSubStructure(o.DESCRIPTOR,'\t')


        logPrt.logCyan('}')
        print()

print_class_structure(message_pb2)

注意:

logPrt 下面的方法就当是print就行了,比如代码中logPrt.logMred->换成print就行了

message_pb2就是由message.proto转化而来的python文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值