Если я хочу добавить значение в поле в буфере протокола, которое неизвестно во время компиляции, я сейчас выполняю setattr. Обычно мне не нравится использовать setattr, поскольку он кажется менее безопасным. Но когда я знаю, что объект является протобуфом, я думаю, что все в порядке, потому что значение, которое я ему присваиваю, должно быть того типа, который допускает протобуф. Так может быть, это не так уж и опасно??
Поясню на примере. Во-первых, предположим, что у меня есть этот protobuf:
Код: Выделить всё
message Person {
string first_name = 1;
string second_name = 1;
int age = 3;
}
Тогда у меня есть код, использующий приведенный выше protobuf:
Код: Выделить всё
from person_pb2 import Person
my_info = {"first_name": "Mike", "last_name": "example", "age": 999}
me = Person()
for field, value in my_info:
setattr(me, field, value)
Это очень гибкий способ обработки protobuf. Я не могу, например, указать это, как в dict, сказав me[field] = value. Тем не менее, me[field] = value совершенно безопасен. Если при использовании setattr значение имеет неправильный тип поля/атрибута, я получу ошибку: TypeError: неверный тип аргумента для встроенной операции
Итак, мне хочется сказать, что для protobufs использование setattr совершенно нормально и фактически является единственным способом программного добавления значений в поля protobuf. Это верно? Есть ли лучший или более безопасный способ? Я не могу сделать что-то вроде me.first_name = "Mike", потому что мне нужно, чтобы это было программно.
Подробнее здесь:
https://stackoverflow.com/questions/788 ... cessary-to