class_docstr: Checker for ast <-> pattern.
  
  NodeVisitor is needed for specific behavior checker.
  
  Attributes
  ----------
  node : AST
      node we want to compare with pattern
  placeholders : [AST]
      list of placeholder value for later comparison or replacement.
class_docstr_tok: ["Checker","for","ast","<","-",">","pattern",".","NodeVisitor","is","needed","for","specific","behavior","checker",".","Attributes","--","--","--","--","--","node",":","AST","node","we","want","to","compare","with","pattern","placeholders",":","[","AST","]","list","of","placeholder","value","for","later","comparison","or","replacement","."]
docstr: Save matching node or compare it with the existing one.
  
  FIXME : What if the new placeholder is a better choice?
docstr_tok: ["Save","matching","node","or","compare","it","with","the","existing","one",".","FIXME",":","What","if","the","new","placeholder","is","a","better","choice","?"]
code: def visit_Placeholder(self, pattern):
      """
      Save matching node or compare it with the existing one.
  
      FIXME : What if the new placeholder is a better choice?
      """
      if pattern.id in self.placeholders and not Check(
          self.node, self.placeholders
      ).visit(self.placeholders[pattern.id]):
          return False
      elif pattern.type is not None and not isinstance(
          self.node, pattern.type
      ):
          return False
      elif pattern.constraint is not None and not pattern.constraint(
          self.node
      ):
          return False
      else:
          self.placeholders[pattern.id] = self.node
          return True
  
imports: from gast import AST, iter_fields, NodeVisitor, Dict, Set
  from itertools import permutations
  from math import isnan
label_desc: Use image node_id 3 for calling the Check obj's underlying member method code with example usage: obj.visit_Placeholder(pattern) and returns: False, False, False, True