Exemple #1
0
 def visit_typeddict_type(self, left: TypedDictType) -> bool:
     right = self.right
     if isinstance(right, Instance):
         return is_subtype(left.fallback, right, self.check_type_parameter)
     elif isinstance(right, TypedDictType):
         if not left.names_are_wider_than(right):
             return False
         for name, l, r in left.zip(right):
             if not is_equivalent(l, r, self.check_type_parameter):
                 return False
             # Non-required key is not compatible with a required key since
             # indexing may fail unexpectedly if a required key is missing.
             # Required key is not compatible with a non-required key since
             # the prior doesn't support 'del' but the latter should support
             # it.
             #
             # NOTE: 'del' support is currently not implemented (#3550). We
             #       don't want to have to change subtyping after 'del' support
             #       lands so here we are anticipating that change.
             if (name in left.required_keys) != (name in right.required_keys):
                 return False
         # (NOTE: Fallbacks don't matter.)
         return True
     else:
         return False
Exemple #2
0
 def visit_typeddict_type(self, left: TypedDictType) -> bool:
     if isinstance(self.right, TypedDictType):
         if left.items.keys() != self.right.items.keys():
             return False
         for (_, left_item_type, right_item_type) in left.zip(self.right):
             if not is_identical_type(left_item_type, right_item_type):
                 return False
         return True
     return False
Exemple #3
0
 def visit_typeddict_type(self, left: TypedDictType) -> bool:
     if isinstance(self.right, TypedDictType):
         if left.items.keys() != self.right.items.keys():
             return False
         for (_, left_item_type, right_item_type) in left.zip(self.right):
             if not is_same_type(left_item_type, right_item_type):
                 return False
         return True
     else:
         return False
Exemple #4
0
 def visit_typeddict_type(self, left: TypedDictType) -> bool:
     if isinstance(self.right, TypedDictType):
         if left.items.keys() != self.right.items.keys():
             return False
         if left.required_keys != self.right.required_keys:
             return False
         for (_, left_item_type, right_item_type) in left.zip(self.right):
             if not is_identical_type(left_item_type, right_item_type):
                 return False
         return True
     return False
Exemple #5
0
 def visit_typeddict_type(self, left: TypedDictType) -> bool:
     right = self.right
     if isinstance(right, Instance):
         return is_subtype(left.fallback, right, self.check_type_parameter)
     elif isinstance(right, TypedDictType):
         if not left.names_are_wider_than(right):
             return False
         for (_, l, r) in left.zip(right):
             if not is_equivalent(l, r, self.check_type_parameter):
                 return False
         # (NOTE: Fallbacks don't matter.)
         return True
     else:
         return False
Exemple #6
0
 def visit_typeddict_type(self, template: TypedDictType) -> List[Constraint]:
     actual = self.actual
     if isinstance(actual, TypedDictType):
         res = []  # type: List[Constraint]
         # NOTE: Non-matching keys are ignored. Compatibility is checked
         #       elsewhere so this shouldn't be unsafe.
         for (item_name, template_item_type, actual_item_type) in template.zip(actual):
             res.extend(infer_constraints(template_item_type,
                                          actual_item_type,
                                          self.direction))
         return res
     elif isinstance(actual, AnyType):
         return self.infer_against_any(template.items.values())
     else:
         return []
Exemple #7
0
 def visit_typeddict_type(self, template: TypedDictType) -> List[Constraint]:
     actual = self.actual
     if isinstance(actual, TypedDictType):
         res = []  # type: List[Constraint]
         # NOTE: Non-matching keys are ignored. Compatibility is checked
         #       elsewhere so this shouldn't be unsafe.
         for (item_name, template_item_type, actual_item_type) in template.zip(actual):
             res.extend(infer_constraints(template_item_type,
                                          actual_item_type,
                                          self.direction))
         return res
     elif isinstance(actual, AnyType):
         return self.infer_against_any(template.items.values(), actual)
     else:
         return []