[Python] Avoid include own type (#8625)

This prevents the include of the type defined in the pyi,
otherwise this leads to error message like this:
error: Name XYZ already defined (possibly by an import)  [no-redef]
This commit is contained in:
Felix
2025-07-15 20:20:09 +02:00
committed by GitHub
parent 4c9079e31b
commit c7b9dc83f5
12 changed files with 45 additions and 16 deletions

View File

@@ -59,5 +59,21 @@ const python::Import &python::Imports::Import(const std::string &module,
imports.push_back(std::move(import));
return imports.back();
}
const python::Import &python::Imports::Export(const std::string &module) {
python::Import import;
import.module = module;
exports.push_back(std::move(import));
return exports.back();
}
const python::Import &python::Imports::Export(const std::string &module,
const std::string &name) {
python::Import import;
import.module = module;
import.name = name;
exports.push_back(std::move(import));
return exports.back();
}
} // namespace python
} // namespace flatbuffers

View File

@@ -85,7 +85,12 @@ struct Imports {
const python::Import &Import(const std::string &module,
const std::string &name);
const python::Import &Export(const std::string &module);
const python::Import &Export(const std::string &module,
const std::string &name);
std::vector<python::Import> imports;
std::vector<python::Import> exports;
};
} // namespace python
} // namespace flatbuffers

View File

@@ -290,6 +290,7 @@ class PythonStubGenerator {
void GenerateObjectStub(std::stringstream &stub, const StructDef *struct_def,
Imports *imports) const {
std::string name = namer_.ObjectType(*struct_def);
imports->Export(ModuleFor(struct_def), namer_.Type(*struct_def));
stub << "class " << name;
if (version_.major != 3) stub << "(object)";
@@ -327,6 +328,7 @@ class PythonStubGenerator {
void GenerateStructStub(std::stringstream &stub, const StructDef *struct_def,
Imports *imports) const {
std::string type = namer_.Type(*struct_def);
imports->Export(ModuleFor(struct_def), namer_.Type(*struct_def));
stub << "class " << type;
if (version_.major != 3) stub << "(object)";
@@ -545,6 +547,7 @@ class PythonStubGenerator {
void GenerateEnumStub(std::stringstream &stub, const EnumDef *enum_def,
Imports *imports) const {
stub << "class " << namer_.Type(*enum_def);
imports->Export(ModuleFor(enum_def), namer_.Type(*enum_def));
if (version_.major == 3){
imports->Import("enum", "IntEnum");
@@ -589,18 +592,32 @@ class PythonStubGenerator {
}
}
// Remove imports from exports
for (const Import &import : imports.exports) {
if (import.name == "") {
modules.erase(import.module);
} else {
auto search = names_by_module.find(import.module);
if (search != names_by_module.end()) {
search->second.erase(import.name);
}
}
}
for (const std::string &module : modules) {
ss << "import " << module << '\n';
}
for (const auto &import : names_by_module) {
ss << "from " << import.first << " import ";
size_t i = 0;
for (const std::string &name : import.second) {
if (i > 0) ss << ", ";
ss << name;
++i;
if (!import.second.empty()) {
ss << "from " << import.first << " import ";
size_t i = 0;
for (const std::string &name : import.second) {
if (i > 0) ss << ", ";
ss << name;
++i;
}
ss << '\n';
}
ss << '\n';
}
}

View File

@@ -5,7 +5,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.ArrayStruct import ArrayStruct
from MyGame.Example.NestedStruct import NestedStruct, NestedStructT
from MyGame.Example.TestEnum import TestEnum

View File

@@ -6,7 +6,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.ArrayStruct import ArrayStruct, ArrayStructT
from MyGame.Example.ArrayTable import ArrayTable
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type

View File

@@ -5,7 +5,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.NestedStruct import NestedStruct
from MyGame.Example.TestEnum import TestEnum
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type

View File

@@ -5,7 +5,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.NestedUnion.Any import Any
from MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnum
from MyGame.Example.NestedUnion.Vec3 import Vec3
from flatbuffers import table

View File

@@ -6,7 +6,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.NestedUnion.Any import Any
from MyGame.Example.NestedUnion.NestedUnionTest import NestedUnionTest
from MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnumT
from MyGame.Example.NestedUnion.Vec3 import Vec3T
from flatbuffers import table

View File

@@ -5,7 +5,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.NestedUnion.Test import Test
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type

View File

@@ -6,7 +6,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.Example.NestedUnion.Color import Color
from MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnum
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type

View File

@@ -7,7 +7,6 @@ import flatbuffers
import typing
from MyGame.Example.NestedUnion.Color import Color
from MyGame.Example.NestedUnion.Test import Test, TestT
from MyGame.Example.NestedUnion.Vec3 import Vec3
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type

View File

@@ -5,7 +5,6 @@ import numpy as np
import flatbuffers
import typing
from MyGame.MonsterExtra import MonsterExtra
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type