code: def visit_Call(self, nodeCall):
          
          super(PatternFinder, self).generic_visit(nodeCall)
          # Capture assignment like 'f = getattr(...)'.
          if hasattr(nodeCall.func, "func"):
              # In this case, the statement should be
              # 'f = getattr(...)()'.
              nodeCall = nodeCall.func
          # Make sure the function's name is 'getattr'.
          if not hasattr(nodeCall.func, "id"):
              return
          if nodeCall.func.id != "getattr":
              return
  
          # Capture 'f = getattr(foo, "bar_%s" % baz )' or
          # 'f = getattr(foo, "bar_" + baz )'.
          nodeArgument = nodeCall.args[1]
          if not isinstance(nodeArgument, ast.BinOp):
              return
          operation = nodeArgument.op
          if type(operation) not in [ast.Mod, ast.Add]:
              return
          nodePattern = nodeArgument.left
          if not isinstance(nodePattern, ast.Str):
              return
          pattern = nodePattern.s
          if not ((type(operation) == ast.Add and pattern.endswith("_")) or
                  (pattern.count("%s") == 1 and pattern.endswith("_%s"))):
              return
          pattern = pattern.replace("%s", "")
          if pattern[:1].isalpha() and not pattern[:1].islower():
              self.patternsClass.add(pattern)
          else:
              self.patternsFunc.add(pattern)
docs: Be invoked when visiting a node of function call.
  
          @param node: currently visiting node