mirror of
https://github.com/protocolbuffers/protobuf
synced 2026-08-26 02:23:14 -04:00
Raise warinings when extend repeated field with none iterable in OSS. OSS will raise errors soon
PiperOrigin-RevId: 542037298
This commit is contained in:
parent
c95ebb7bd8
commit
96ca7d96da
4 changed files with 19 additions and 25 deletions
|
|
@ -150,7 +150,6 @@ def protobuf_deps():
|
|||
_github_archive(
|
||||
name = "upb",
|
||||
repo = "https://github.com/protocolbuffers/upb",
|
||||
commit = "56a770818cf47f8ac9e2ac1585a8d2b764214479",
|
||||
sha256 = "",
|
||||
commit = "0ea9f73be35e35db242ccc65aa9c87487b792324",
|
||||
patches = ["@com_google_protobuf//build_defs:upb.patch"],
|
||||
)
|
||||
|
|
|
|||
|
|
@ -159,17 +159,17 @@ class RepeatedScalarFieldContainer(BaseContainer[_T], MutableSequence[_T]):
|
|||
|
||||
def extend(self, elem_seq: Iterable[_T]) -> None:
|
||||
"""Extends by appending the given iterable. Similar to list.extend()."""
|
||||
# TODO(b/286557203): Change OSS to raise error too
|
||||
if elem_seq is None:
|
||||
return
|
||||
try:
|
||||
elem_seq_iter = iter(elem_seq)
|
||||
except TypeError:
|
||||
if not elem_seq:
|
||||
# silently ignore falsy inputs :-/.
|
||||
# TODO(ptucker): Deprecate this behavior. b/18413862
|
||||
warnings.warn('Value is not iterable. Please remove the wrong '
|
||||
'usage. This will be changed to raise TypeError soon.')
|
||||
return
|
||||
raise
|
||||
|
||||
new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter]
|
||||
if new_values:
|
||||
self._values.extend(new_values)
|
||||
|
|
|
|||
|
|
@ -1005,47 +1005,36 @@ class MessageTest(unittest.TestCase):
|
|||
with self.assertRaises(NameError) as _:
|
||||
m.repeated_nested_enum.extend(a for i in range(10)) # pylint: disable=undefined-variable
|
||||
|
||||
FALSY_VALUES = [None, False, 0, 0.0, b'', u'', bytearray(), [], {}, set()]
|
||||
FALSY_VALUES = [None, False, 0, 0.0]
|
||||
EMPTY_VALUES = [b'', u'', bytearray(), [], {}, set()]
|
||||
|
||||
def testExtendInt32WithNothing(self, message_module):
|
||||
"""Test no-ops extending repeated int32 fields."""
|
||||
m = message_module.TestAllTypes()
|
||||
self.assertSequenceEqual([], m.repeated_int32)
|
||||
|
||||
# TODO(ptucker): Deprecate this behavior. b/18413862
|
||||
for falsy_value in MessageTest.FALSY_VALUES:
|
||||
m.repeated_int32.extend(falsy_value)
|
||||
for empty_value in MessageTest.EMPTY_VALUES:
|
||||
m.repeated_int32.extend(empty_value)
|
||||
self.assertSequenceEqual([], m.repeated_int32)
|
||||
|
||||
m.repeated_int32.extend([])
|
||||
self.assertSequenceEqual([], m.repeated_int32)
|
||||
|
||||
def testExtendFloatWithNothing(self, message_module):
|
||||
"""Test no-ops extending repeated float fields."""
|
||||
m = message_module.TestAllTypes()
|
||||
self.assertSequenceEqual([], m.repeated_float)
|
||||
|
||||
# TODO(ptucker): Deprecate this behavior. b/18413862
|
||||
for falsy_value in MessageTest.FALSY_VALUES:
|
||||
m.repeated_float.extend(falsy_value)
|
||||
for empty_value in MessageTest.EMPTY_VALUES:
|
||||
m.repeated_float.extend(empty_value)
|
||||
self.assertSequenceEqual([], m.repeated_float)
|
||||
|
||||
m.repeated_float.extend([])
|
||||
self.assertSequenceEqual([], m.repeated_float)
|
||||
|
||||
def testExtendStringWithNothing(self, message_module):
|
||||
"""Test no-ops extending repeated string fields."""
|
||||
m = message_module.TestAllTypes()
|
||||
self.assertSequenceEqual([], m.repeated_string)
|
||||
|
||||
# TODO(ptucker): Deprecate this behavior. b/18413862
|
||||
for falsy_value in MessageTest.FALSY_VALUES:
|
||||
m.repeated_string.extend(falsy_value)
|
||||
for empty_value in MessageTest.EMPTY_VALUES:
|
||||
m.repeated_string.extend(empty_value)
|
||||
self.assertSequenceEqual([], m.repeated_string)
|
||||
|
||||
m.repeated_string.extend([])
|
||||
self.assertSequenceEqual([], m.repeated_string)
|
||||
|
||||
def testExtendInt32WithPythonList(self, message_module):
|
||||
"""Test extending repeated int32 fields with python lists."""
|
||||
m = message_module.TestAllTypes()
|
||||
|
|
|
|||
|
|
@ -466,11 +466,17 @@ static int AssSubscript(PyObject* pself, PyObject* slice, PyObject* value) {
|
|||
PyObject* Extend(RepeatedScalarContainer* self, PyObject* value) {
|
||||
cmessage::AssureWritable(self->parent);
|
||||
|
||||
// TODO(ptucker): Deprecate this behavior. b/18413862
|
||||
// TODO(b/286557203): Remove this in OSS
|
||||
if (value == Py_None) {
|
||||
PyErr_Warn(nullptr,
|
||||
"Value is not iterable. Please remove the wrong usage."
|
||||
" This will be changed to raise TypeError soon.");
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
if ((Py_TYPE(value)->tp_as_sequence == nullptr) && PyObject_Not(value)) {
|
||||
PyErr_Warn(nullptr,
|
||||
"Value is not iterable. Please remove the wrong usage."
|
||||
" This will be changed to raise TypeError soon.");
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue