Takes a name and optional contextName returns a list of matches.
        `wrap_response` can be True to return a TNRSResponse object, None to return
            the "raw" response dict, or a function/class that takes (response, query_data=dict)
            as its arguments.

        Each match is a dict with:
           'higher' boolean DEF???
           'exact' boolean for exact match
           'ottId' int
           'name'  name (or uniqname???) for the taxon in OTT
           'nodeId' int ID of not in the taxomachine db. probably not of use to anyone...

def TNRS(self,
             names,
             context_name=None,
             id_list=None,
             fuzzy_matching=False,
             include_deprecated=False,
             include_dubious=False,
             do_approximate_matching=None,
             wrap_response=None):
        """Takes a name and optional contextName returns a list of matches.
        `wrap_response` can be True to return a TNRSResponse object, None to return
            the "raw" response dict, or a function/class that takes (response, query_data=dict)
            as its arguments.

        Each match is a dict with:
           'higher' boolean DEF???
           'exact' boolean for exact match
           'ottId' int
           'name'  name (or uniqname???) for the taxon in OTT
           'nodeId' int ID of not in the taxomachine db. probably not of use to anyone...
        """
        # if context_name is None:
        #    context_name = 'All life'
        if do_approximate_matching is not None:
            fuzzy_matching = do_approximate_matching
        if context_name and context_name not in self.valid_contexts:
            raise ValueError('"{}" is not a valid context name'.format(context_name))
        if not (isinstance(names, list) or isinstance(names, tuple)):
            names = [names]
        for name in names:
            if len(name) < 2:
                raise ValueError('Name "{}" found. Names must have at least 2 characters!'.format(name))
        if id_list and len(id_list) != len(names):
            raise ValueError('"id_list must be the same size as "names"')
        data = {'names': names}
        if self.use_v1:
            uri = '{p}/contextQueryForNames'.format(p=self.prefix)
        else:
            uri = '{p}/match_names'.format(p=self.prefix)
        if context_name:
            if self.use_v1:
                data['contextName'] = context_name
            else:
                data['context_name'] = context_name
        data['do_approximate_matching'] = bool(fuzzy_matching)
        if id_list:
            data['ids'] = list(id_list)
        if include_deprecated:
            data['include_deprecated'] = True
        if include_dubious:
            data['include_dubious'] = True
        resp = self.json_http_post(uri, data=anyjson.dumps(data))
        if wrap_response is None or wrap_response is False:
            return resp
        if wrap_response is True:
            return TNRSResponse(self._wr, resp, query_data=data)
        return wrap_response(resp, query_data=data)