You need to enable JavaScript to run this app. Python编写AI约束满足问题时_SpecialGenericAlias项赋值错误求解
优惠活动
大模型
产品
解决方案
定价
更多

Python编写AI约束满足问题时_SpecialGenericAlias项赋值错误求解

报错原因
  • 核心错误是类型标注语法使用错误:Dict[str, List[str]]是typing模块提供的类型注解对象,仅用于标注变量的类型,不能参与链式赋值。你书写的domains = Dict[str, List[str]] = {}会把类型对象Dict[str, List[str]]错误覆盖为空字典,后续你操作的domains变量实际指向的是被修改的类型对象,自然不支持字典的项赋值操作。
  • 代码还存在三处隐藏问题:
    1. 未给domains字典的每个key预先初始化空列表,直接调用append方法会触发KeyError
    2. CSP类的__init__方法中将传入的domains参数赋值给了self.domain属性,但后续backtracking_search方法中调用的是self.domains,属性名不一致会触发属性不存在报错
    3. add_constraint方法中的变量存在性判断逻辑写反,原判断条件永远不会生效,无法正常校验约束关联的变量是否属于当前CSP实例
修复方案
  1. 修正domains变量的类型标注和初始化逻辑:
variables: List[str] = ["DJ", "SO", "ET", "KE", "UG", "TA", "RW", "BU"]
# 正确的变量类型标注写法,用冒号声明类型,等号赋值
domains: Dict[str, List[str]] = {}
for variable in variables:
    # 先给每个变量初始化空列表,再添加颜色值
    domains[variable] = []
    domains[variable].append("Red")
    domains[variable].append("Green")
    domains[variable].append("Blue")
  1. 修正CSP类的属性名:
class CSP(Generic[V, D]):
    def __init__(self, variables: List[V], domains: Dict[V, List[D]]) -> None:
        self.variables: List[V] = variables
        # 将原self.domain修改为self.domains,和后续调用的属性名保持一致
        self.domains: Dict[V, List[D]] = domains
        self.constraints: Dict[V, List[Constraint[V, D]]] = {}
        for variable in self.variables:
            self.constraints[variable] = []
  1. 修正add_constraint方法的判断逻辑:
def add_constraint(self, constraint: Constraint[V, D]) -> None:
    for variable in constraint.variables:
        # 修正判断条件,检查变量是否属于当前CSP的变量列表
        if variable not in self.variables:
            print("Variable in Constraint, not in CSP")
        else:
            self.constraints[variable].append(constraint)

内容的提问来源于stack exchange,提问作者Abdul Ahad Akram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:15:01