You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PEP695注解表达工厂与产品的自引用泛型关联?

解决PEP695泛型中Self在约束上下文无效的问题

问题原因

Pylance提示'Self is not valid in this context',是因为Self类型注解不能用于泛型参数的约束表达式里。PEP695当前实现中,Self仅支持在类内部的方法返回值、属性定义等场景使用,没法在泛型参数的bound约束里引用当前类的类型。

解决方案

用typing.TypeVar定义两个互相绑定的类型变量,通过bound参数实现工厂与产品的双向类型约束,替代原代码里Self的用法。

修改后的代码示例

factory.py

from typing import TypeVar
from abc import ABC
from __future__ import annotations  # 开启后可避免前向引用的字符串写法

# 定义互相绑定的类型变量,实现双向约束
F = TypeVar("F", bound="AbstractFactory")
G = TypeVar("G", bound="AbstractGood")

class AbstractFactory[G: AbstractGood[F]](ABC):
    def __init__(self, good_class: type[G]) -> None:
        self.good_class = good_class
    
    def produce(self) -> G:
        good = self.good_class(self)
        return good
        
class AbstractGood[F: AbstractFactory[G]](ABC):
    def __init__(self, factory: F):
        self.factory = factory

charlie.py

from factory import AbstractFactory, AbstractGood

class ChocolateFactory(AbstractFactory[ChocolateBar]):
    ...

class ChocolateBar(AbstractGood[ChocolateFactory]):
    ...

说明

  • 定义的F和G两个TypeVar,通过bound参数分别绑定到对方关联的抽象类,既让AbstractFactory明确生产的产品类型,也让AbstractGood明确关联的工厂类型,实现了双向类型约束。
  • 如果没有开启from __future__ import annotations,子类继承时需要用字符串字面量(比如AbstractFactory["ChocolateBar"])避免前向引用错误。

内容的提问来源于stack exchange,提问作者winwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:11:03