Доступ к объединению Flatbuffers в Python

У меня есть следующие определения в моем файле схемы:

union UGeometry { Polygon, Point, Linestring }

table Point {
    point:Vec2;
}

table Polygon {
    points:[Vec2List]; 
}

table Geometry {
    g:UGeometry;
}

(Удален некоторый шаблонный код для проверки типов и прочего)

В таблице Geometry хранятся геометрические объекты типа Point, Polygon и LineString. Я могу получить доступ к этому на С++ и Javascript, как обычно, например. в Javascript я использую следующее, чтобы получить тип Polygon:

var rawPolygon = flatBufGeometry.g( new storage.Polygon() );

Однако я не могу найти такой аксессор в сгенерированном коде Python. Следующее не будет работать:

rawPolygon = rawGeometry.G()(storage.Polygon.Polygon())

Как я могу получить доступ к объектам объединения Flatbuffers в таблице с помощью Python?


person benjist    schedule 06.12.2018    source источник


Ответы (1)


Вот пример файла monster.fbs от Google, так как все flatbuffer имеют схожую структуру и сгенерированный файл python.

union Equipment { Weapon } // Optionally add more tables.


table Monster {
  pos:Vec3;
  mana:short = 150;
  hp:short = 100;
  name:string;
  friendly:bool = false (deprecated);
  inventory:[ubyte];
  color:Color = Blue;
  weapons:[Weapon];
  equipped:Equipment;
  path:[Vec3];
}

table Weapon {
  name:string;
  damage:short;
}

root_type Monster;

чтобы получить доступ к оружию, попробуйте

import MyGame.Sample.Equipment
import MyGame.Sample.Weapon

union_weapon = MyGame.Sample.Weapon.Weapon()
union_weapon.Init(monster.Equipped().Bytes, monster.Equipped().Pos)

источник: https://github.com/google/flatbuffers/blob/master/samples/monster.fbs https://github.com/google/flatbuffers/blob/master/samples/sample_binary.py

person Qihang Xu    schedule 24.07.2019