isinstance doesn't work when use reflection of python protobuf v2.6.1

ぐ巨炮叔叔 提交于 2019-12-23 13:19:09

问题


I am using dynamic reflection functionality of python protobuf v2.6.1, and have a function like below:

# initilization code

        des_db_ = descriptor_database.DescriptorDatabase()
        des_pool_ = descriptor_pool.DescriptorPool(des_db_)


        fdp = descriptor_pb2.FileDescriptorProto.FromString(
            a_pb_module.DESCRIPTOR.serialized_pb)
        des_db_.Add(fdp)


def unpack_PB_msg(type_name, pb_msg_str)
        factory = message_factory.MessageFactory(des_pool_)
        msg_class = factory.GetPrototype(des_pool_.FindMessageTypeByName(type_name))

        pb_msg = msg_class()
        pb_msg.ParseFromString(pb_msg_str)

       return pb_msg

But following client code will fail

hello = Hello_msg()
hello_str = hello.SerializeToString()
hello2 = unpack_PB_msg(Hello_msg.DESCRIPTOR.full_name, hello_str)

hello3 = Hello_msg()
hello3.CopyFrom(hello2)# failed here!!!

The error message is:

hello3.CopyFrom(hello2)
  File "C:\Localdata\Python27\lib\site-packages\google\protobuf\message.py", line 119, in CopyFrom
    self.MergeFrom(other_msg)
  File "C:\Localdata\Python27\lib\site-packages\google\protobuf\internal\python_message.py", line 971, in MergeFrom
    "expected %s got %s." % (cls.__name__, type(msg).__name__))
TypeError: Parameter to MergeFrom() must be instance of same class: expected Hello_msg got Hello_msg.

It seems CopyFrom fails because isinstance fails.

  def MergeFrom(self, msg):
    if not isinstance(msg, cls):
      raise TypeError(
          "Parameter to MergeFrom() must be instance of same class: "
          "expected %s got %s." % (cls.__name__, type(msg).__name__))

When print data type of hello2 and hello3, it seems they are different.

hello2 : <class 'Hello_msg'>
hello3 : <class 'a_pb_module.Hello_msg'>

Is this a protobuf bug? or I made something wrong?


回答1:


This may be able to help someone. I had the same error

TypeError: Parameter to MergeFrom() must be instance of same class: expected Hello_msg got Hello_msg.

when I imported the same class twice at two different paths, it results in two different classes imported at different paths (Even though they might have the same class name, Python sees them as two completely different class (check the ID of the class, you should find them to be different)).

To solve this issue, you need to make sure the same class (Hello_msg) is imported only once.



来源:https://stackoverflow.com/questions/31843088/isinstance-doesnt-work-when-use-reflection-of-python-protobuf-v2-6-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!