diff --git a/src/neo4j/_async/bookmark_manager.py b/src/neo4j/_async/bookmark_manager.py index b9a278c5..004e0847 100644 --- a/src/neo4j/_async/bookmark_manager.py +++ b/src/neo4j/_async/bookmark_manager.py @@ -51,10 +51,13 @@ def __init__( if not initial_bookmarks: self._bookmarks = set() else: - self._bookmarks = set(getattr( - initial_bookmarks, "raw_values", - t.cast(t.Iterable[str], initial_bookmarks) - )) + if not hasattr(initial_bookmarks, "raw_values"): + initial_bookmarks = Bookmarks.from_raw_values( + t.cast(t.Iterable[str], initial_bookmarks) + ) + self._bookmarks = set( + t.cast(Bookmarks, initial_bookmarks).raw_values + ) self._lock = AsyncCooperativeLock() async def update_bookmarks( diff --git a/src/neo4j/_sync/bookmark_manager.py b/src/neo4j/_sync/bookmark_manager.py index b75b7493..c2cd522a 100644 --- a/src/neo4j/_sync/bookmark_manager.py +++ b/src/neo4j/_sync/bookmark_manager.py @@ -51,10 +51,13 @@ def __init__( if not initial_bookmarks: self._bookmarks = set() else: - self._bookmarks = set(getattr( - initial_bookmarks, "raw_values", - t.cast(t.Iterable[str], initial_bookmarks) - )) + if not hasattr(initial_bookmarks, "raw_values"): + initial_bookmarks = Bookmarks.from_raw_values( + t.cast(t.Iterable[str], initial_bookmarks) + ) + self._bookmarks = set( + t.cast(Bookmarks, initial_bookmarks).raw_values + ) self._lock = CooperativeLock() def update_bookmarks( diff --git a/src/neo4j/api.py b/src/neo4j/api.py index 4306bb98..9af802cb 100644 --- a/src/neo4j/api.py +++ b/src/neo4j/api.py @@ -287,8 +287,12 @@ def from_raw_values(cls, values: t.Iterable[str]) -> Bookmarks: bookmarks. :param values: ASCII string values (raw bookmarks) - :type values: Iterable[str] """ + if isinstance(values, str): + # Unfortunately, str itself is an iterable of str, iterating + # over characters. Type checkers will not catch this, so we help + # the user out. + values = values, obj = cls() bookmarks = [] for value in values: