@@ -2193,6 +2193,55 @@ def is_class_attr(name: str, klass: nodes.ClassDef) -> bool:
21932193 return False
21942194
21952195
2196+ def is_defined (name : str , node : nodes .NodeNG ) -> bool :
2197+ """Checks whether a node defines the given variable name."""
2198+ is_defined_so_far = False
2199+
2200+ if isinstance (node , nodes .NamedExpr ) and node .target .name == name :
2201+ return True
2202+
2203+ if isinstance (node , (nodes .Import , nodes .ImportFrom )) and any (
2204+ node_name [0 ] == name for node_name in node .names
2205+ ):
2206+ return True
2207+
2208+ if isinstance (node , nodes .With ):
2209+ is_defined_so_far = any (
2210+ isinstance (item [1 ], nodes .AssignName ) and item [1 ].name == name
2211+ for item in node .items
2212+ )
2213+
2214+ if isinstance (node , (nodes .ClassDef , nodes .FunctionDef )):
2215+ is_defined_so_far = node .name == name
2216+
2217+ if isinstance (node , nodes .AnnAssign ):
2218+ is_defined_so_far = (
2219+ node .value
2220+ and isinstance (node .target , nodes .AssignName )
2221+ and node .target .name == name
2222+ )
2223+
2224+ if isinstance (node , nodes .Assign ):
2225+ is_defined_so_far = any (
2226+ any (
2227+ (
2228+ (
2229+ isinstance (elt , nodes .Starred )
2230+ and isinstance (elt .value , nodes .AssignName )
2231+ and elt .value .name == name
2232+ )
2233+ or (isinstance (elt , nodes .AssignName ) and elt .name == name )
2234+ )
2235+ for elt in get_all_elements (target )
2236+ )
2237+ for target in node .targets
2238+ )
2239+
2240+ return is_defined_so_far or any (
2241+ is_defined (name , child ) for child in node .get_children ()
2242+ )
2243+
2244+
21962245def get_inverse_comparator (op : str ) -> str :
21972246 """Returns the inverse comparator given a comparator.
21982247
0 commit comments