| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- """Handle files using a thread pool executor."""
- import asyncio
- import sys
- from functools import partial, singledispatch
- from io import (
- BufferedIOBase,
- BufferedRandom,
- BufferedReader,
- BufferedWriter,
- FileIO,
- TextIOBase,
- )
- from ..base import AiofilesContextManager
- from .binary import (
- AsyncBufferedIOBase,
- AsyncBufferedReader,
- AsyncFileIO,
- AsyncIndirectBufferedIOBase,
- )
- from .text import AsyncTextIndirectIOWrapper, AsyncTextIOWrapper
- sync_open = open
- __all__ = (
- "open",
- "stdin",
- "stdout",
- "stderr",
- "stdin_bytes",
- "stdout_bytes",
- "stderr_bytes",
- )
- def open(
- file,
- mode="r",
- buffering=-1,
- encoding=None,
- errors=None,
- newline=None,
- closefd=True,
- opener=None,
- *,
- loop=None,
- executor=None,
- ):
- return AiofilesContextManager(
- _open(
- file,
- mode=mode,
- buffering=buffering,
- encoding=encoding,
- errors=errors,
- newline=newline,
- closefd=closefd,
- opener=opener,
- loop=loop,
- executor=executor,
- )
- )
- async def _open(
- file,
- mode="r",
- buffering=-1,
- encoding=None,
- errors=None,
- newline=None,
- closefd=True,
- opener=None,
- *,
- loop=None,
- executor=None,
- ):
- """Open an asyncio file."""
- if loop is None:
- loop = asyncio.get_running_loop()
- cb = partial(
- sync_open,
- file,
- mode=mode,
- buffering=buffering,
- encoding=encoding,
- errors=errors,
- newline=newline,
- closefd=closefd,
- opener=opener,
- )
- f = await loop.run_in_executor(executor, cb)
- return wrap(f, loop=loop, executor=executor)
- @singledispatch
- def wrap(file, *, loop=None, executor=None):
- raise TypeError("Unsupported io type: {}.".format(file))
- @wrap.register(TextIOBase)
- def _(file, *, loop=None, executor=None):
- return AsyncTextIOWrapper(file, loop=loop, executor=executor)
- @wrap.register(BufferedWriter)
- @wrap.register(BufferedIOBase)
- def _(file, *, loop=None, executor=None):
- return AsyncBufferedIOBase(file, loop=loop, executor=executor)
- @wrap.register(BufferedReader)
- @wrap.register(BufferedRandom)
- def _(file, *, loop=None, executor=None):
- return AsyncBufferedReader(file, loop=loop, executor=executor)
- @wrap.register(FileIO)
- def _(file, *, loop=None, executor=None):
- return AsyncFileIO(file, loop=loop, executor=executor)
- stdin = AsyncTextIndirectIOWrapper("sys.stdin", None, None, indirect=lambda: sys.stdin)
- stdout = AsyncTextIndirectIOWrapper(
- "sys.stdout", None, None, indirect=lambda: sys.stdout
- )
- stderr = AsyncTextIndirectIOWrapper(
- "sys.stderr", None, None, indirect=lambda: sys.stderr
- )
- stdin_bytes = AsyncIndirectBufferedIOBase(
- "sys.stdin.buffer", None, None, indirect=lambda: sys.stdin.buffer
- )
- stdout_bytes = AsyncIndirectBufferedIOBase(
- "sys.stdout.buffer", None, None, indirect=lambda: sys.stdout.buffer
- )
- stderr_bytes = AsyncIndirectBufferedIOBase(
- "sys.stderr.buffer", None, None, indirect=lambda: sys.stderr.buffer
- )
|