import sys
from types import TracebackType
from typing import Any, Callable, Generic, Iterator, List
-from typing import Optional, NoReturn, Sequence, Type, TYPE_CHECKING, TypeVar
+from typing import Optional, NoReturn, Sequence, Type, TypeVar, TYPE_CHECKING
from contextlib import contextmanager
from . import pq
fetch = generators.fetch
send = generators.send
+_C = TypeVar("_C", bound="Cursor[Any]")
+
class BaseCursor(Generic[ConnectionType, Row]):
# Slots with __weakref__ and generic bases don't work on Py 3.6
self._closed = True
-AnyCursor = TypeVar("AnyCursor", bound="BaseCursor[Any, Any]")
-
-
class Cursor(BaseCursor["Connection[Any]", Row]):
__module__ = "psycopg"
__slots__ = ()
super().__init__(connection)
self._row_factory = row_factory
- def __enter__(self: AnyCursor) -> AnyCursor:
+ def __enter__(self: _C) -> _C:
return self
def __exit__(
return self._row_factory(self)
def execute(
- self: AnyCursor,
+ self: _C,
query: Query,
params: Optional[Params] = None,
*,
prepare: Optional[bool] = None,
binary: Optional[bool] = None,
- ) -> AnyCursor:
+ ) -> _C:
"""
Execute a query or command to the database.
"""
from types import TracebackType
from typing import Any, AsyncIterator, List
-from typing import Optional, Sequence, Type, TYPE_CHECKING
+from typing import Optional, Sequence, Type, TypeVar, TYPE_CHECKING
from . import errors as e
from .abc import Query, Params
from .copy import AsyncCopy
from .rows import Row, RowMaker, AsyncRowFactory
-from .cursor import BaseCursor, AnyCursor
+from .cursor import BaseCursor
from ._compat import asynccontextmanager
if TYPE_CHECKING:
from .connection_async import AsyncConnection
+_C = TypeVar("_C", bound="AsyncCursor[Any]")
+
class AsyncCursor(BaseCursor["AsyncConnection[Any]", Row]):
__module__ = "psycopg"
super().__init__(connection)
self._row_factory = row_factory
- async def __aenter__(self: AnyCursor) -> AnyCursor:
+ async def __aenter__(self: _C) -> _C:
return self
async def __aexit__(
return self._row_factory(self)
async def execute(
- self: AnyCursor,
+ self: _C,
query: Query,
params: Optional[Params] = None,
*,
prepare: Optional[bool] = None,
binary: Optional[bool] = None,
- ) -> AnyCursor:
+ ) -> _C:
try:
async with self._conn.lock:
await self._conn.wait(
# Copyright (C) 2020-2021 The Psycopg Team
import warnings
-from typing import Any, AsyncIterator, cast, Generic, List, Iterator, Optional
-from typing import Sequence, TYPE_CHECKING
+from typing import Any, AsyncIterator, Generic, List, Iterator, Optional
+from typing import Sequence, TypeVar, TYPE_CHECKING
from . import pq
from . import sql
from . import errors as e
from .abc import ConnectionType, Query, Params, PQGen
from .rows import Row, RowFactory, AsyncRowFactory
-from .cursor import AnyCursor, BaseCursor, Cursor, execute
+from .cursor import BaseCursor, Cursor, execute
from .cursor_async import AsyncCursor
from ._encodings import pgconn_encoding
return sql.SQL(" ").join(parts)
+_C = TypeVar("_C", bound="ServerCursor[Any]")
+_AC = TypeVar("_AC", bound="AsyncServerCursor[Any]")
+
+
class ServerCursor(Cursor[Row]):
__module__ = "psycopg"
__slots__ = ("_helper", "itersize")
super().close()
def execute(
- self: AnyCursor,
+ self: _C,
query: Query,
params: Optional[Params] = None,
*,
binary: Optional[bool] = None,
**kwargs: Any,
- ) -> AnyCursor:
+ ) -> _C:
"""
Open a cursor to execute a query to the database.
"""
if kwargs:
raise TypeError(f"keyword not supported: {list(kwargs)[0]}")
- helper = cast(ServerCursor[Row], self)._helper
+ helper = self._helper
query = helper._make_declare_statement(self, query)
if binary is None:
await super().close()
async def execute(
- self: AnyCursor,
+ self: _AC,
query: Query,
params: Optional[Params] = None,
*,
binary: Optional[bool] = None,
**kwargs: Any,
- ) -> AnyCursor:
+ ) -> _AC:
if kwargs:
raise TypeError(f"keyword not supported: {list(kwargs)[0]}")
- helper = cast(AsyncServerCursor[Row], self)._helper
+ helper = self._helper
query = helper._make_declare_statement(self, query)
if binary is None: