Python编写AI约束满足问题时_SpecialGenericAlias项赋值错误求解
报错原因
- 核心错误是类型标注语法使用错误:
Dict[str, List[str]]是typing模块提供的类型注解对象,仅用于标注变量的类型,不能参与链式赋值。你书写的domains = Dict[str, List[str]] = {}会把类型对象Dict[str, List[str]]错误覆盖为空字典,后续你操作的domains变量实际指向的是被修改的类型对象,自然不支持字典的项赋值操作。 - 代码还存在三处隐藏问题:
- 未给
domains字典的每个key预先初始化空列表,直接调用append方法会触发KeyError CSP类的__init__方法中将传入的domains参数赋值给了self.domain属性,但后续backtracking_search方法中调用的是self.domains,属性名不一致会触发属性不存在报错add_constraint方法中的变量存在性判断逻辑写反,原判断条件永远不会生效,无法正常校验约束关联的变量是否属于当前CSP实例
- 未给
修复方案
- 修正
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")
- 修正
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] = []
- 修正
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
相关产品推荐
相关产品推荐

