Skip to content

Commit e5a601a

Browse files
committed
[Python] Improve python API
- Make the Python API similar to Rust and Swift for improved usability - Make StartVector vector public since it is already being used in generated code - Also fix script path in warning
1 parent 7675121 commit e5a601a

File tree

18 files changed

+600
-88
lines changed

18 files changed

+600
-88
lines changed

docs/source/tutorial.md

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,12 +1134,8 @@ The Builder provides multiple ways to create `vectors`.
11341134
=== "Python"
11351135

11361136
```py
1137-
# Create a FlatBuffer vector and prepend the weapons.
1138-
# Note: Since we prepend the data, prepend them in reverse order.
1139-
MyGame.Sample.Monster.StartWeaponsVector(builder, 2)
1140-
builder.PrependUOffsetTRelative(axe)
1141-
builder.PrependUOffsetTRelative(sword)
1142-
weapons = builder.EndVector()
1137+
# Use the generated helper to create the weapons vector from offsets.
1138+
weapons = MyGame.Sample.Monster.CreateWeaponsVector(builder, [sword, axe])
11431139
```
11441140

11451141
=== "Rust"
@@ -1352,16 +1348,13 @@ bit more directly.
13521348
```py
13531349
# Create a `vector` representing the inventory of the Orc. Each number
13541350
# could correspond to an item that can be claimed after he is slain.
1355-
# Note: Since we prepend the bytes, this loop iterates in reverse.
1356-
MyGame.Sample.Monster.StartInventoryVector(builder, 10)
1357-
for i in reversed(range(0, 10)):
1358-
builder.PrependByte(i)
1359-
inv = builder.EndVector()
1360-
1361-
MyGame.Sample.Monster.StartPathVector(builder, 2)
1362-
MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0)
1363-
MyGame.Sample.Vec3.CreateVec3(builder, 4.0, 5.0, 6.0)
1364-
path = builder.EndVector()
1351+
inv = MyGame.Sample.Monster.CreateInventoryVector(builder, range(0, 10))
1352+
1353+
path_points = [
1354+
MyGame.Sample.Vec3T(x=1.0, y=2.0, z=3.0),
1355+
MyGame.Sample.Vec3T(x=4.0, y=5.0, z=6.0),
1356+
]
1357+
path = MyGame.Sample.Monster.CreatePathVector(builder, path_points)
13651358
```
13661359

13671360
=== "Rust"

python/flatbuffers/builder.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,6 @@ def PrependUOffsetTRelative(self, off):
415415
off2 = self.Offset() - off + N.UOffsetTFlags.bytewidth
416416
self.PlaceUOffsetT(off2)
417417

418-
## @cond FLATBUFFERS_INTERNAL
419418
def StartVector(self, elemSize, numElems, alignment):
420419
"""StartVector initializes bookkeeping for writing a new vector.
421420
@@ -431,8 +430,6 @@ def StartVector(self, elemSize, numElems, alignment):
431430
self.Prep(alignment, elemSize * numElems) # In case alignment > int.
432431
return self.Offset()
433432

434-
## @endcond
435-
436433
def EndVector(self, numElems=None):
437434
"""EndVector writes data necessary to finish vector construction."""
438435

@@ -550,6 +547,21 @@ def CreateNumpyVector(self, x):
550547
self.vectorNumElems = x.size
551548
return self.EndVector()
552549

550+
def CreateVectorOfTables(self, offsets):
551+
"""CreateVectorOfTables writes a vector of offsets such as tables or strings.
552+
553+
Args:
554+
offsets: Iterable of offsets returned from previous builder operations.
555+
Each element should be an integer compatible with UOffsetT.
556+
"""
557+
558+
offsets = list(offsets)
559+
self.StartVector(N.UOffsetTFlags.bytewidth, len(offsets),
560+
N.UOffsetTFlags.bytewidth)
561+
for off in reversed(offsets):
562+
self.PrependUOffsetTRelative(off)
563+
return self.EndVector()
564+
553565
## @cond FLATBUFFERS_INTERNAL
554566
def assertNested(self):
555567
"""Check that we are in the process of building an object."""

python/flatbuffers/reflection/Enum.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ def EnumStartValuesVector(builder, numElems):
155155
def StartValuesVector(builder, numElems):
156156
return EnumStartValuesVector(builder, numElems)
157157

158+
def EnumCreateValuesVector(builder, data):
159+
return builder.CreateVectorOfTables(data)
160+
161+
def CreateValuesVector(builder, data):
162+
EnumCreateValuesVector(builder, data)
163+
158164
def EnumAddIsUnion(builder, isUnion):
159165
builder.PrependBoolSlot(2, isUnion, 0)
160166

@@ -179,6 +185,12 @@ def EnumStartAttributesVector(builder, numElems):
179185
def StartAttributesVector(builder, numElems):
180186
return EnumStartAttributesVector(builder, numElems)
181187

188+
def EnumCreateAttributesVector(builder, data):
189+
return builder.CreateVectorOfTables(data)
190+
191+
def CreateAttributesVector(builder, data):
192+
EnumCreateAttributesVector(builder, data)
193+
182194
def EnumAddDocumentation(builder, documentation):
183195
builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
184196

@@ -191,6 +203,12 @@ def EnumStartDocumentationVector(builder, numElems):
191203
def StartDocumentationVector(builder, numElems):
192204
return EnumStartDocumentationVector(builder, numElems)
193205

206+
def EnumCreateDocumentationVector(builder, data):
207+
return builder.CreateVectorOfTables(data)
208+
209+
def CreateDocumentationVector(builder, data):
210+
EnumCreateDocumentationVector(builder, data)
211+
194212
def EnumAddDeclarationFile(builder, declarationFile):
195213
builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)
196214

python/flatbuffers/reflection/EnumVal.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ def EnumValStartDocumentationVector(builder, numElems):
134134
def StartDocumentationVector(builder, numElems):
135135
return EnumValStartDocumentationVector(builder, numElems)
136136

137+
def EnumValCreateDocumentationVector(builder, data):
138+
return builder.CreateVectorOfTables(data)
139+
140+
def CreateDocumentationVector(builder, data):
141+
EnumValCreateDocumentationVector(builder, data)
142+
137143
def EnumValAddAttributes(builder, attributes):
138144
builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)
139145

@@ -146,6 +152,12 @@ def EnumValStartAttributesVector(builder, numElems):
146152
def StartAttributesVector(builder, numElems):
147153
return EnumValStartAttributesVector(builder, numElems)
148154

155+
def EnumValCreateAttributesVector(builder, data):
156+
return builder.CreateVectorOfTables(data)
157+
158+
def CreateAttributesVector(builder, data):
159+
EnumValCreateAttributesVector(builder, data)
160+
149161
def EnumValEnd(builder):
150162
return builder.EndObject()
151163

python/flatbuffers/reflection/Field.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,12 @@ def FieldStartAttributesVector(builder, numElems):
235235
def StartAttributesVector(builder, numElems):
236236
return FieldStartAttributesVector(builder, numElems)
237237

238+
def FieldCreateAttributesVector(builder, data):
239+
return builder.CreateVectorOfTables(data)
240+
241+
def CreateAttributesVector(builder, data):
242+
FieldCreateAttributesVector(builder, data)
243+
238244
def FieldAddDocumentation(builder, documentation):
239245
builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
240246

@@ -247,6 +253,12 @@ def FieldStartDocumentationVector(builder, numElems):
247253
def StartDocumentationVector(builder, numElems):
248254
return FieldStartDocumentationVector(builder, numElems)
249255

256+
def FieldCreateDocumentationVector(builder, data):
257+
return builder.CreateVectorOfTables(data)
258+
259+
def CreateDocumentationVector(builder, data):
260+
FieldCreateDocumentationVector(builder, data)
261+
250262
def FieldAddOptional(builder, optional):
251263
builder.PrependBoolSlot(11, optional, 0)
252264

python/flatbuffers/reflection/Object.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ def ObjectStartFieldsVector(builder, numElems):
158158
def StartFieldsVector(builder, numElems):
159159
return ObjectStartFieldsVector(builder, numElems)
160160

161+
def ObjectCreateFieldsVector(builder, data):
162+
return builder.CreateVectorOfTables(data)
163+
164+
def CreateFieldsVector(builder, data):
165+
ObjectCreateFieldsVector(builder, data)
166+
161167
def ObjectAddIsStruct(builder, isStruct):
162168
builder.PrependBoolSlot(2, isStruct, 0)
163169

@@ -188,6 +194,12 @@ def ObjectStartAttributesVector(builder, numElems):
188194
def StartAttributesVector(builder, numElems):
189195
return ObjectStartAttributesVector(builder, numElems)
190196

197+
def ObjectCreateAttributesVector(builder, data):
198+
return builder.CreateVectorOfTables(data)
199+
200+
def CreateAttributesVector(builder, data):
201+
ObjectCreateAttributesVector(builder, data)
202+
191203
def ObjectAddDocumentation(builder, documentation):
192204
builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
193205

@@ -200,6 +212,12 @@ def ObjectStartDocumentationVector(builder, numElems):
200212
def StartDocumentationVector(builder, numElems):
201213
return ObjectStartDocumentationVector(builder, numElems)
202214

215+
def ObjectCreateDocumentationVector(builder, data):
216+
return builder.CreateVectorOfTables(data)
217+
218+
def CreateDocumentationVector(builder, data):
219+
ObjectCreateDocumentationVector(builder, data)
220+
203221
def ObjectAddDeclarationFile(builder, declarationFile):
204222
builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)
205223

python/flatbuffers/reflection/RPCCall.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ def RPCCallStartAttributesVector(builder, numElems):
138138
def StartAttributesVector(builder, numElems):
139139
return RPCCallStartAttributesVector(builder, numElems)
140140

141+
def RPCCallCreateAttributesVector(builder, data):
142+
return builder.CreateVectorOfTables(data)
143+
144+
def CreateAttributesVector(builder, data):
145+
RPCCallCreateAttributesVector(builder, data)
146+
141147
def RPCCallAddDocumentation(builder, documentation):
142148
builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
143149

@@ -150,6 +156,12 @@ def RPCCallStartDocumentationVector(builder, numElems):
150156
def StartDocumentationVector(builder, numElems):
151157
return RPCCallStartDocumentationVector(builder, numElems)
152158

159+
def RPCCallCreateDocumentationVector(builder, data):
160+
return builder.CreateVectorOfTables(data)
161+
162+
def CreateDocumentationVector(builder, data):
163+
RPCCallCreateDocumentationVector(builder, data)
164+
153165
def RPCCallEnd(builder):
154166
return builder.EndObject()
155167

python/flatbuffers/reflection/Schema.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ def SchemaStartObjectsVector(builder, numElems):
180180
def StartObjectsVector(builder, numElems):
181181
return SchemaStartObjectsVector(builder, numElems)
182182

183+
def SchemaCreateObjectsVector(builder, data):
184+
return builder.CreateVectorOfTables(data)
185+
186+
def CreateObjectsVector(builder, data):
187+
SchemaCreateObjectsVector(builder, data)
188+
183189
def SchemaAddEnums(builder, enums):
184190
builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(enums), 0)
185191

@@ -192,6 +198,12 @@ def SchemaStartEnumsVector(builder, numElems):
192198
def StartEnumsVector(builder, numElems):
193199
return SchemaStartEnumsVector(builder, numElems)
194200

201+
def SchemaCreateEnumsVector(builder, data):
202+
return builder.CreateVectorOfTables(data)
203+
204+
def CreateEnumsVector(builder, data):
205+
SchemaCreateEnumsVector(builder, data)
206+
195207
def SchemaAddFileIdent(builder, fileIdent):
196208
builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(fileIdent), 0)
197209

@@ -222,6 +234,12 @@ def SchemaStartServicesVector(builder, numElems):
222234
def StartServicesVector(builder, numElems):
223235
return SchemaStartServicesVector(builder, numElems)
224236

237+
def SchemaCreateServicesVector(builder, data):
238+
return builder.CreateVectorOfTables(data)
239+
240+
def CreateServicesVector(builder, data):
241+
SchemaCreateServicesVector(builder, data)
242+
225243
def SchemaAddAdvancedFeatures(builder, advancedFeatures):
226244
builder.PrependUint64Slot(6, advancedFeatures, 0)
227245

@@ -240,6 +258,12 @@ def SchemaStartFbsFilesVector(builder, numElems):
240258
def StartFbsFilesVector(builder, numElems):
241259
return SchemaStartFbsFilesVector(builder, numElems)
242260

261+
def SchemaCreateFbsFilesVector(builder, data):
262+
return builder.CreateVectorOfTables(data)
263+
264+
def CreateFbsFilesVector(builder, data):
265+
SchemaCreateFbsFilesVector(builder, data)
266+
243267
def SchemaEnd(builder):
244268
return builder.EndObject()
245269

python/flatbuffers/reflection/SchemaFile.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ def SchemaFileStartIncludedFilenamesVector(builder, numElems):
8484
def StartIncludedFilenamesVector(builder, numElems):
8585
return SchemaFileStartIncludedFilenamesVector(builder, numElems)
8686

87+
def SchemaFileCreateIncludedFilenamesVector(builder, data):
88+
return builder.CreateVectorOfTables(data)
89+
90+
def CreateIncludedFilenamesVector(builder, data):
91+
SchemaFileCreateIncludedFilenamesVector(builder, data)
92+
8793
def SchemaFileEnd(builder):
8894
return builder.EndObject()
8995

python/flatbuffers/reflection/Service.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,12 @@ def ServiceStartCallsVector(builder, numElems):
137137
def StartCallsVector(builder, numElems):
138138
return ServiceStartCallsVector(builder, numElems)
139139

140+
def ServiceCreateCallsVector(builder, data):
141+
return builder.CreateVectorOfTables(data)
142+
143+
def CreateCallsVector(builder, data):
144+
ServiceCreateCallsVector(builder, data)
145+
140146
def ServiceAddAttributes(builder, attributes):
141147
builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)
142148

@@ -149,6 +155,12 @@ def ServiceStartAttributesVector(builder, numElems):
149155
def StartAttributesVector(builder, numElems):
150156
return ServiceStartAttributesVector(builder, numElems)
151157

158+
def ServiceCreateAttributesVector(builder, data):
159+
return builder.CreateVectorOfTables(data)
160+
161+
def CreateAttributesVector(builder, data):
162+
ServiceCreateAttributesVector(builder, data)
163+
152164
def ServiceAddDocumentation(builder, documentation):
153165
builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
154166

@@ -161,6 +173,12 @@ def ServiceStartDocumentationVector(builder, numElems):
161173
def StartDocumentationVector(builder, numElems):
162174
return ServiceStartDocumentationVector(builder, numElems)
163175

176+
def ServiceCreateDocumentationVector(builder, data):
177+
return builder.CreateVectorOfTables(data)
178+
179+
def CreateDocumentationVector(builder, data):
180+
ServiceCreateDocumentationVector(builder, data)
181+
164182
def ServiceAddDeclarationFile(builder, declarationFile):
165183
builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)
166184

0 commit comments

Comments
 (0)