Я не понимаю первую часть последнего предложения о пакетах из документации по google Python protobuf:
Файл .proto
начинается с объявления пакета, что помогает предотвратить конфликты имен междуразные проекты.В Python пакеты обычно определяются структурой каталогов, поэтому пакет, который вы определяете в файле .proto
, не будет влиять на сгенерированный код.Однако вы все равно должны объявить один , чтобы избежать конфликтов имен в пространстве имен буферов протокола , а также в языках, не являющихся Python.
На самом деле неверно, что " пакет, который вы определили в своем файле .proto
, не будет влиять на сгенерированный код " в Python (и, вероятно, поэтому в языках, которые используютпространства имен), поскольку сгенерированные файлы ..._pb2.py
содержат дескрипторы, которые имеют поле пакета.
DESCRIPTOR = _descriptor.FileDescriptor(
name='example.proto',
package='example',
syntax='proto3',
...
)
Я проверил, и вы не можете import example
в обычный файл Python после генерации кода.т.е. объявление package example;
в вашем .proto
файле и затем protoc
его компиляция не делает ваш пакет доступным для импорта в файлах python в вашей среде (вы все равно должны использовать import ..._pb2
для доступа к классам).
Кто-нибудь может объяснить, как пакеты, объявленные в .proto
файлах, используются как в Python, так и в C # в качестве примера языка, который явно использует пространства имен?