Skip to content

Commit 26a61c8

Browse files
PYTHON-2926 Updated signature of Binary.from_vector to take a BinaryVector (mongodb#1963)
1 parent 5f7afea commit 26a61c8

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

bson/binary.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import struct
1717
from dataclasses import dataclass
1818
from enum import Enum
19-
from typing import TYPE_CHECKING, Any, Sequence, Tuple, Type, Union
19+
from typing import TYPE_CHECKING, Any, Optional, Sequence, Tuple, Type, Union
2020
from uuid import UUID
2121

2222
"""Tools for representing BSON binary data.
@@ -400,24 +400,35 @@ def as_uuid(self, uuid_representation: int = UuidRepresentation.STANDARD) -> UUI
400400
@classmethod
401401
def from_vector(
402402
cls: Type[Binary],
403-
vector: list[int, float],
404-
dtype: BinaryVectorDtype,
405-
padding: int = 0,
403+
vector: Union[BinaryVector, list[int, float]],
404+
dtype: Optional[BinaryVectorDtype] = None,
405+
padding: Optional[int] = None,
406406
) -> Binary:
407-
"""**(BETA)** Create a BSON :class:`~bson.binary.Binary` of Vector subtype from a list of Numbers.
407+
"""**(BETA)** Create a BSON :class:`~bson.binary.Binary` of Vector subtype.
408408
409409
To interpret the representation of the numbers, a data type must be included.
410410
See :class:`~bson.binary.BinaryVectorDtype` for available types and descriptions.
411411
412412
The dtype and padding are prepended to the binary data's value.
413413
414-
:param vector: List of values
414+
:param vector: Either a List of values, or a :class:`~bson.binary.BinaryVector` dataclass.
415415
:param dtype: Data type of the values
416416
:param padding: For fractional bytes, number of bits to ignore at end of vector.
417417
:return: Binary packed data identified by dtype and padding.
418418
419419
.. versionadded:: 4.10
420420
"""
421+
if isinstance(vector, BinaryVector):
422+
if dtype or padding:
423+
raise ValueError(
424+
"The first argument, vector, has type BinaryVector. "
425+
"dtype or padding cannot be separately defined, but were."
426+
)
427+
dtype = vector.dtype
428+
padding = vector.padding
429+
vector = vector.data # type: ignore
430+
431+
padding = 0 if padding is None else padding
421432
if dtype == BinaryVectorDtype.INT8: # pack ints in [-128, 127] as signed int8
422433
format_str = "b"
423434
if padding:
@@ -432,7 +443,7 @@ def from_vector(
432443
raise NotImplementedError("%s not yet supported" % dtype)
433444

434445
metadata = struct.pack("<sB", dtype.value, padding)
435-
data = struct.pack(f"<{len(vector)}{format_str}", *vector)
446+
data = struct.pack(f"<{len(vector)}{format_str}", *vector) # type: ignore
436447
return cls(metadata + data, subtype=VECTOR_SUBTYPE)
437448

438449
def as_vector(self) -> BinaryVector:

test/test_bson.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@
5151
is_valid,
5252
json_util,
5353
)
54-
from bson.binary import USER_DEFINED_SUBTYPE, Binary, BinaryVectorDtype, UuidRepresentation
54+
from bson.binary import (
55+
USER_DEFINED_SUBTYPE,
56+
Binary,
57+
BinaryVector,
58+
BinaryVectorDtype,
59+
UuidRepresentation,
60+
)
5561
from bson.code import Code
5662
from bson.codec_options import CodecOptions, DatetimeConversion
5763
from bson.datetime_ms import _DATETIME_ERROR_SUGGESTION
@@ -785,6 +791,18 @@ def test_vector(self):
785791
else:
786792
self.fail("Failed to raise an exception.")
787793

794+
# Test form of Binary.from_vector(BinaryVector)
795+
796+
assert padded_vec == Binary.from_vector(
797+
BinaryVector(list_vector, BinaryVectorDtype.PACKED_BIT, padding)
798+
)
799+
assert binary_vector == Binary.from_vector(
800+
BinaryVector(list_vector, BinaryVectorDtype.INT8)
801+
)
802+
assert float_binary == Binary.from_vector(
803+
BinaryVector(list_vector, BinaryVectorDtype.FLOAT32)
804+
)
805+
788806
def test_unicode_regex(self):
789807
"""Tests we do not get a segfault for C extension on unicode RegExs.
790808
This had been happening.

0 commit comments

Comments
 (0)