_streams.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from __future__ import annotations
  2. import math
  3. from typing import TypeVar
  4. from warnings import warn
  5. from ..streams.memory import (
  6. MemoryObjectReceiveStream,
  7. MemoryObjectSendStream,
  8. _MemoryObjectStreamState,
  9. )
  10. T_Item = TypeVar("T_Item")
  11. class create_memory_object_stream(
  12. tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]],
  13. ):
  14. """
  15. Create a memory object stream.
  16. The stream's item type can be annotated like
  17. :func:`create_memory_object_stream[T_Item]`.
  18. :param max_buffer_size: number of items held in the buffer until ``send()`` starts
  19. blocking
  20. :param item_type: old way of marking the streams with the right generic type for
  21. static typing (does nothing on AnyIO 4)
  22. .. deprecated:: 4.0
  23. Use ``create_memory_object_stream[YourItemType](...)`` instead.
  24. :return: a tuple of (send stream, receive stream)
  25. """
  26. def __new__( # type: ignore[misc]
  27. cls, max_buffer_size: float = 0, item_type: object = None
  28. ) -> tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]]:
  29. if max_buffer_size != math.inf and not isinstance(max_buffer_size, int):
  30. raise ValueError("max_buffer_size must be either an integer or math.inf")
  31. if max_buffer_size < 0:
  32. raise ValueError("max_buffer_size cannot be negative")
  33. if item_type is not None:
  34. warn(
  35. "The item_type argument has been deprecated in AnyIO 4.0. "
  36. "Use create_memory_object_stream[YourItemType](...) instead.",
  37. DeprecationWarning,
  38. stacklevel=2,
  39. )
  40. state = _MemoryObjectStreamState[T_Item](max_buffer_size)
  41. return (MemoryObjectSendStream(state), MemoryObjectReceiveStream(state))