Любой лучший код для определения общего TLV, инициированного для различных типов

Может быть, больше это объектно-ориентированное программирование -

определил общий TLV как

 class MYTLV(Packet):
       fields_desc = [
             ByteEnumField("type", 0x1, defaultTLV_enum),
             FieldLenField("length", None, fmt='B', length_of="value"),
             StrLenField("value", "ABCDEF", length_from=lambda x:x.length)
       ]

У меня много TLV одной формы, но другого типа. Как я могу иметь лучший код, чтобы уменьшить это в кодах, как

     class newTLV(MYTLV):
          some code to say or initiaze type field of this newTLV to newTLV_enum
     ....

Так что позже я могу использовать как -

     PacketListField('tlvlist', [], newTLV(fields.type=newTLV_enum))

Все TLV одинаковы, кроме словаря для поля типа.

    class MYTLV1(Packet):
       fields_desc = [
             ByteEnumField("type", 0x1, TLV1_enum),
             FieldLenField("length", None, fmt='B', length_of="value"),
             StrLenField("value", "ABCDEF", length_from=lambda x:x.length)
       ]
   class MYTLV2(Packet):
       fields_desc = [
             ByteEnumField("type", 0x1, TLV2_enum),
             FieldLenField("length", None, fmt='B', length_of="value"),
             StrLenField("value", "ABCDEF", length_from=lambda x:x.length)
       ]

1 ответ

Решение

Вы можете сделать это так:

base_fields_desc = [
    FieldLenField("length", None, fmt='B', length_of="value"),
    StrLenField("value", "ABCDEF", length_from=lambda x:x.length)
]

def fields_desc_with_enum_type(enum_type):
    fields_desc = base_fields_desc[:]
    fields_desc.insert(0, ByteEnumField("type", 0x1, enum_type))
    return fields_desc


class MYTLV1(Packet):
    fields_desc = fields_desc_with_enum_type(TLV1_enum)

class MYTLV2(Packet):
    fields_desc = fields_desc_with_enum_type(TLV2_enum)
Другие вопросы по тегам