@@ -52,9 +52,9 @@ class PythonStubGenerator {
52
52
public:
53
53
PythonStubGenerator (const Parser &parser, const std::string &path,
54
54
const Version &version)
55
- : parser_{parser},
56
- namer_{WithFlagOptions (kStubConfig , parser.opts , path),
57
- Keywords (version)},
55
+ : parser_{ parser },
56
+ namer_{ WithFlagOptions (kStubConfig , parser.opts , path),
57
+ Keywords (version) },
58
58
version_ (version) {}
59
59
60
60
bool Generate () {
@@ -140,8 +140,7 @@ class PythonStubGenerator {
140
140
return module ;
141
141
}
142
142
143
- template <typename T>
144
- std::string ModuleFor (const T *def) const {
143
+ template <typename T> std::string ModuleFor (const T *def) const {
145
144
if (parser_.opts .one_file ) return ModuleForFile (def->file );
146
145
return namer_.NamespacedType (*def);
147
146
}
@@ -165,7 +164,7 @@ class PythonStubGenerator {
165
164
return " None" ;
166
165
}
167
166
168
- template <typename F>
167
+ template <typename F>
169
168
std::string UnionType (const EnumDef &enum_def, Imports *imports,
170
169
F type) const {
171
170
imports->Import (" typing" );
@@ -181,14 +180,9 @@ class PythonStubGenerator {
181
180
result += import .name ;
182
181
break ;
183
182
}
184
- case BASE_TYPE_STRING:
185
- result += " str" ;
186
- break ;
187
- case BASE_TYPE_NONE:
188
- result += " None" ;
189
- break ;
190
- default :
191
- break ;
183
+ case BASE_TYPE_STRING: result += " str" ; break ;
184
+ case BASE_TYPE_NONE: result += " None" ; break ;
185
+ default : break ;
192
186
}
193
187
}
194
188
return " typing.Union[" + result + " ]" ;
@@ -229,18 +223,14 @@ class PythonStubGenerator {
229
223
namer_.Type (*type.struct_def ));
230
224
return import .name ;
231
225
}
232
- case BASE_TYPE_STRING:
233
- return " str" ;
226
+ case BASE_TYPE_STRING: return " str" ;
234
227
case BASE_TYPE_ARRAY:
235
228
case BASE_TYPE_VECTOR: {
236
229
imports->Import (" typing" );
237
230
return " typing.List[" + TypeOf (type.VectorType (), imports) + " ]" ;
238
231
}
239
- case BASE_TYPE_UNION:
240
- return UnionType (*type.enum_def , imports);
241
- default :
242
- FLATBUFFERS_ASSERT (0 );
243
- return " " ;
232
+ case BASE_TYPE_UNION: return UnionType (*type.enum_def , imports);
233
+ default : FLATBUFFERS_ASSERT (0 ); return " " ;
244
234
}
245
235
}
246
236
@@ -262,8 +252,7 @@ class PythonStubGenerator {
262
252
namer_.ObjectType (*field_type.struct_def ));
263
253
return field_name + " : " + import .name + " | None" ;
264
254
}
265
- case BASE_TYPE_STRING:
266
- return field_name + " : str | None" ;
255
+ case BASE_TYPE_STRING: return field_name + " : str | None" ;
267
256
case BASE_TYPE_ARRAY:
268
257
case BASE_TYPE_VECTOR: {
269
258
imports->Import (" typing" );
@@ -282,8 +271,7 @@ class PythonStubGenerator {
282
271
case BASE_TYPE_UNION:
283
272
return field_name + " : " +
284
273
UnionObjectType (*field->value .type .enum_def , imports);
285
- default :
286
- return field_name;
274
+ default : return field_name;
287
275
}
288
276
}
289
277
@@ -312,9 +300,7 @@ class PythonStubGenerator {
312
300
field_type = " '" + import_.name + " ' | None" ;
313
301
break ;
314
302
}
315
- case BASE_TYPE_STRING:
316
- field_type = " str | None" ;
317
- break ;
303
+ case BASE_TYPE_STRING: field_type = " str | None" ; break ;
318
304
case BASE_TYPE_ARRAY:
319
305
case BASE_TYPE_VECTOR: {
320
306
imports->Import (" typing" );
@@ -334,9 +320,7 @@ class PythonStubGenerator {
334
320
case BASE_TYPE_UNION:
335
321
field_type = UnionObjectType (*type.enum_def , imports);
336
322
break ;
337
- default :
338
- field_type = " typing.Any" ;
339
- break ;
323
+ default : field_type = " typing.Any" ; break ;
340
324
}
341
325
}
342
326
stub << " " << field_name << " : " << field_type << " = ...,\n " ;
@@ -485,8 +469,7 @@ class PythonStubGenerator {
485
469
stub << " def " << name << " (self) -> table.Table | None: ...\n " ;
486
470
break ;
487
471
}
488
- default :
489
- break ;
472
+ default : break ;
490
473
}
491
474
}
492
475
}
@@ -530,9 +513,7 @@ class PythonStubGenerator {
530
513
stub << ' \n ' ;
531
514
stub << " def Create" + namer_.Type (*struct_def)
532
515
<< " (builder: flatbuffers.Builder" ;
533
- for (const std::string &arg : args) {
534
- stub << " , " << arg;
535
- }
516
+ for (const std::string &arg : args) { stub << " , " << arg; }
536
517
stub << " ) -> uoffset: ...\n " ;
537
518
}
538
519
@@ -610,11 +591,10 @@ class PythonStubGenerator {
610
591
611
592
imports->Import (" typing" , " cast" );
612
593
613
- if (version_.major == 3 ){
594
+ if (version_.major == 3 ) {
614
595
imports->Import (" enum" , " IntEnum" );
615
596
stub << " (IntEnum)" ;
616
- }
617
- else {
597
+ } else {
618
598
stub << " (object)" ;
619
599
}
620
600
@@ -637,16 +617,15 @@ class PythonStubGenerator {
637
617
ss << " from __future__ import annotations\n " ;
638
618
ss << ' \n ' ;
639
619
ss << " import flatbuffers\n " ;
640
- if (parser_.opts .python_gen_numpy ) {
641
- ss << " import numpy as np\n " ;
642
- }
620
+ if (parser_.opts .python_gen_numpy ) { ss << " import numpy as np\n " ; }
643
621
ss << ' \n ' ;
644
622
645
623
std::set<std::string> modules;
646
624
std::map<std::string, std::set<std::string>> names_by_module;
647
625
for (const Import &import : imports.imports ) {
648
626
if (import .IsLocal ()) continue ; // skip all local imports
649
- if (import .module == " flatbuffers" && import .name == " " ) continue ; // skip double include hardcoded flatbuffers
627
+ if (import .module == " flatbuffers" && import .name == " " )
628
+ continue ; // skip double include hardcoded flatbuffers
650
629
if (import .name == " " ) {
651
630
modules.insert (import .module );
652
631
} else {
@@ -686,7 +665,8 @@ class PythonStubGenerator {
686
665
const Parser &parser_;
687
666
const IdlNamer namer_;
688
667
const Version version_;
689
- };} // namespace
668
+ };
669
+ } // namespace
690
670
691
671
class PythonGenerator : public BaseGenerator {
692
672
public:
@@ -695,8 +675,8 @@ class PythonGenerator : public BaseGenerator {
695
675
: BaseGenerator(parser, path, file_name, " " /* not used */ ,
696
676
" " /* not used */ , " py" ),
697
677
float_const_gen_ (" float('nan')" , " float('inf')" , " float('-inf')" ),
698
- namer_(WithFlagOptions(kConfig , parser.opts, path),
699
- Keywords(version)) { }
678
+ namer_(WithFlagOptions(kConfig , parser.opts, path), Keywords(version)) {
679
+ }
700
680
701
681
// Most field accessors need to retrieve and test the field offset first,
702
682
// this is the prefix code for that.
@@ -886,9 +866,8 @@ class PythonGenerator : public BaseGenerator {
886
866
GenReceiver (struct_def, code_ptr);
887
867
code += namer_.Method (field);
888
868
889
- const ImportMapEntry import_entry = {
890
- GenPackageReference (field.value .type ), TypeName (field)
891
- };
869
+ const ImportMapEntry import_entry = { GenPackageReference (field.value .type ),
870
+ TypeName (field) };
892
871
893
872
if (parser_.opts .python_typing ) {
894
873
const std::string return_type = ReturnType (struct_def, field);
@@ -948,9 +927,8 @@ class PythonGenerator : public BaseGenerator {
948
927
GenReceiver (struct_def, code_ptr);
949
928
code += namer_.Method (field) + " (self)" ;
950
929
951
- const ImportMapEntry import_entry = {
952
- GenPackageReference (field.value .type ), TypeName (field)
953
- };
930
+ const ImportMapEntry import_entry = { GenPackageReference (field.value .type ),
931
+ TypeName (field) };
954
932
955
933
if (parser_.opts .python_typing ) {
956
934
const std::string return_type = ReturnType (struct_def, field);
@@ -1036,11 +1014,8 @@ class PythonGenerator : public BaseGenerator {
1036
1014
code += Indent + Indent + " return None\n\n " ;
1037
1015
}
1038
1016
1039
- template <typename T>
1040
- std::string ModuleFor (const T *def) const {
1041
- if (!parser_.opts .one_file ) {
1042
- return namer_.NamespacedType (*def);
1043
- }
1017
+ template <typename T> std::string ModuleFor (const T *def) const {
1018
+ if (!parser_.opts .one_file ) { return namer_.NamespacedType (*def); }
1044
1019
1045
1020
std::string filename =
1046
1021
StripExtension (def->file ) + parser_.opts .filename_suffix ;
@@ -1070,9 +1045,8 @@ class PythonGenerator : public BaseGenerator {
1070
1045
1071
1046
GenReceiver (struct_def, code_ptr);
1072
1047
code += namer_.Method (field);
1073
- const ImportMapEntry import_entry = {
1074
- GenPackageReference (field.value .type ), TypeName (field)
1075
- };
1048
+ const ImportMapEntry import_entry = { GenPackageReference (field.value .type ),
1049
+ TypeName (field) };
1076
1050
1077
1051
if (parser_.opts .python_typing ) {
1078
1052
const std::string return_type = ReturnType (struct_def, field);
@@ -1195,8 +1169,7 @@ class PythonGenerator : public BaseGenerator {
1195
1169
std::string qualified_name = NestedFlatbufferType (unqualified_name);
1196
1170
if (qualified_name.empty ()) { qualified_name = nested->constant ; }
1197
1171
1198
- const ImportMapEntry import_entry = { qualified_name,
1199
- unqualified_name };
1172
+ const ImportMapEntry import_entry = { qualified_name, unqualified_name };
1200
1173
1201
1174
auto &code = *code_ptr;
1202
1175
GenReceiver (struct_def, code_ptr);
@@ -1808,8 +1781,8 @@ class PythonGenerator : public BaseGenerator {
1808
1781
}
1809
1782
field_type = " Optional[List[" + field_type + " ]" ;
1810
1783
} else {
1811
- field_type =
1812
- " Optional[List[ " + GetBasePythonTypeForScalarAndString (base_type) + " ]]" ;
1784
+ field_type = " Optional[List[ " +
1785
+ GetBasePythonTypeForScalarAndString (base_type) + " ]]" ;
1813
1786
}
1814
1787
}
1815
1788
@@ -1858,11 +1831,12 @@ class PythonGenerator : public BaseGenerator {
1858
1831
const auto field_field = namer_.Field (field);
1859
1832
1860
1833
// Build signature with keyword arguments, type hints, and default values.
1861
- signature_params += GenIndents (2 ) + field_field + " = " + default_value + " ," ;
1834
+ signature_params +=
1835
+ GenIndents (2 ) + field_field + " = " + default_value + " ," ;
1862
1836
1863
1837
// Build the body of the __init__ method.
1864
1838
init_body += GenIndents (2 ) + " self." + field_field + " = " + field_field +
1865
- " # type: " + field_type;
1839
+ " # type: " + field_type;
1866
1840
}
1867
1841
1868
1842
// Writes __init__ method.
@@ -1954,10 +1928,16 @@ class PythonGenerator : public BaseGenerator {
1954
1928
auto &field = **it;
1955
1929
if (field.deprecated ) continue ;
1956
1930
1957
- // Wrties the comparison statement for this field.
1958
- const auto field_field = namer_.Field (field);
1959
- code += " and \\ " + GenIndents (3 ) + " self." + field_field +
1960
- " == " + " other." + field_field;
1931
+ // Writes the comparison statement for this field.
1932
+ const auto field_name = namer_.Field (field);
1933
+ if (parser_.opts .python_gen_numpy &&
1934
+ field.value .type .base_type == BASE_TYPE_VECTOR) {
1935
+ code += " and \\ " + GenIndents (3 ) + " np.array_equal(self." +
1936
+ field_name + " , " + " other." + field_name + " )" ;
1937
+ } else {
1938
+ code += " and \\ " + GenIndents (3 ) + " self." + field_name +
1939
+ " == " + " other." + field_name;
1940
+ }
1961
1941
}
1962
1942
code += " \n " ;
1963
1943
}
@@ -2154,7 +2134,6 @@ class PythonGenerator : public BaseGenerator {
2154
2134
auto &field = **it;
2155
2135
if (field.deprecated ) continue ;
2156
2136
2157
- auto field_type = TypeName (field);
2158
2137
switch (field.value .type .base_type ) {
2159
2138
case BASE_TYPE_STRUCT: {
2160
2139
GenUnPackForStruct (struct_def, field, &code);
@@ -2338,9 +2317,9 @@ class PythonGenerator : public BaseGenerator {
2338
2317
2339
2318
if (parser_.opts .python_gen_numpy ) {
2340
2319
code_prefix += GenIndents (3 ) + " if np is not None and type(self." +
2341
- field_field + " ) is np.ndarray:" ;
2320
+ field_field + " ) is np.ndarray:" ;
2342
2321
code_prefix += GenIndents (4 ) + field_field +
2343
- " = builder.CreateNumpyVector(self." + field_field + " )" ;
2322
+ " = builder.CreateNumpyVector(self." + field_field + " )" ;
2344
2323
code_prefix += GenIndents (3 ) + " else:" ;
2345
2324
GenPackForScalarVectorFieldHelper (struct_def, field, code_prefix_ptr, 4 );
2346
2325
code_prefix += " (self." + field_field + " [i])" ;
@@ -2788,9 +2767,7 @@ class PythonGenerator : public BaseGenerator {
2788
2767
}
2789
2768
}
2790
2769
}
2791
- if (parser_.opts .python_gen_numpy ) {
2792
- code += " np = import_numpy()\n\n " ;
2793
- }
2770
+ if (parser_.opts .python_gen_numpy ) { code += " np = import_numpy()\n\n " ; }
2794
2771
}
2795
2772
}
2796
2773
@@ -2828,7 +2805,7 @@ class PythonGenerator : public BaseGenerator {
2828
2805
2829
2806
static bool GeneratePython (const Parser &parser, const std::string &path,
2830
2807
const std::string &file_name) {
2831
- python::Version version{parser.opts .python_version };
2808
+ python::Version version{ parser.opts .python_version };
2832
2809
if (!version.IsValid ()) return false ;
2833
2810
2834
2811
python::PythonGenerator generator (parser, path, file_name, version);
0 commit comments