Рефакторинг кода согласно принципам чистого кода и покрытие тестами

Главный дефект — P объявлен TypeVar вместо ParamSpec, а Action не оформлен как generic. Кроме того, __get__ получает объект с connection, не сам AsyncConnection. obj.number возвращает PositiveValue, не число.

Короткий ответ

Что ответить на собеседовании

Главный дефект — P объявлен TypeVar вместо ParamSpec, а Action не оформлен как generic. Кроме того, get получает объект с connection, не сам AsyncConnection. obj.number возвращает PositiveValue, не число.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо привести представленный фрагмент кода к требованиям чистого кода:

  • Добавить недостающие аннотации типов.
  • Оформить docstring для всех классов и их методов.
  • Повысить читаемость (правильные отступы, при необходимости – более осмысленные имена переменных).
  • При необходимости разбить код на отдельные модули.
  • Реализовать юнит‑тесты, проверяющие ключевые части программы.
from collections.abc import Callable
from typing import Any, TypeVar, Concatenate, overload
from contextlib import asynccontextmanager
from dataclasses import dataclass
from functools import partial
from psycopg import AsyncConnection
from psycopg.types import TypeInfo
from certmanager.storages import sql

T = TypeVar('T')
P = TypeVar('P')
BaseActionT = Callable[Concatenate[AsyncConnection[Any], P], T]

@dataclass(slots=True)
class Action:
    action_function: BaseActionT[T, P]

    @overload
    def __get__(self, client: None, *args: Any) -> 'Action[T, P]': ...

    @overload
    def __get__(self, client: AsyncConnection[Any], *args: Any) -> Callable[P, T]: ...

    def __get__(self, client: AsyncConnection[Any] | None, *args: Any) -> Any:
        if client is None:
            return self
        return partial(self.action_function, client.connection)

class PositiveValue:
    def get(self) -> int:
        """Возвращает положительное целое значение."""
        return 1  # пример значения

class MyClass:
    def __init__(self) -> None:
        self.number = PositiveValue()

obj = MyClass()
obj.number

Ответ

Главный дефект — P объявлен TypeVar вместо ParamSpec, а Action не оформлен как generic. Кроме того, get получает объект с connection, не сам AsyncConnection. obj.number возвращает PositiveValue, не число.

Сначала исправьте контракт дескриптора; пример для Python 3.10+:

from functools import partial
from typing import Any, Callable, Concatenate, Generic, ParamSpec, Protocol, TypeVar
from psycopg import AsyncConnection

P = ParamSpec('P')
T = TypeVar('T')

class Client(Protocol):
    """Объект, предоставляющий соединение."""
    connection: AsyncConnection[Any]

class Action(Generic[P, T]):
    """Связывает действие с соединением клиента."""
    def __init__(self, function: Callable[Concatenate[AsyncConnection[Any], P], T]) -> None:
        """Сохраняет функцию без её выполнения."""
        self.function = function

    def __get__(self, client: Client | None, owner: type | None = None) -> Any:
        """Возвращает дескриптор или связанное действие."""
        return self if client is None else partial(self.function, client.connection)

Для точного типа результата get добавьте overload для None и Client. Удалите неиспользуемые импорты. В тестах подставьте fake connection и проверьте доступ через класс, передачу соединения первым аргументом и проброс результата/ошибки. Для числа нужен obj.number.get(), если PositiveValue не превращён в дескриптор.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее