Код: Выделить всё
"""Example of boto3 client lazy initialization"""
from typing import Optional
import boto3
from botocore.client import BaseClient
from mypy_boto3_ec2 import EC2Client
class ClassA:
"""Abstract class which lazily initializes the boto3 client"""
def __init__(self) -> None:
self._client: Optional[BaseClient] = None
self.client_type: str = ""
@property
def client(self):
"""Lazy boto3 client initialization"""
if not self._client:
self._client = boto3.client(self.client_type)
return self._client
class ClassB(ClassA):
"""One of many concrete child classes of the ClassA"""
def __init__(self) -> None:
super().__init__()
self._client: Optional[EC2Client] = None
self.client_type: str = "ec2"
def some_method(self) -> dict:
"""Just a method to try random EC2Client functionality"""
result = self.client.describe_instances()
return result
- Я не могу переопределить родительский тип BaseClient конкретным классом EC2Client
- Когда я оставляю необязательный для типа клиента, значение None не имеет значения совместим с типами BaseClient и EC2Client
- Когда я оставляю клиент необязательным, NoneType не имеет атрибута define_instances.
- Когда я оставляю ClassA._client нетипизированным и равным None, клиент дочернего класса снова становится клиентом несовместимо.
Вопросы, которые я использовал в качестве источников:
- Я пытаюсь ввести аннотацию для boto3, но у модуля botocore.client нет атрибута EC2.
- Какова правильная аннотация типа для boto3.client(service)
Переопределение подтипа переменной несовместимо
Подробнее здесь: https://stackoverflow.com/questions/793 ... to3-client
Мобильная версия