def analisar_retorno(retorno,
        classe_resposta=RespostaSAT, campos=RespostaSAT.CAMPOS,
        campos_alternativos=[], funcao=None, manter_verbatim=True):
    """Analisa o retorno (supostamente um retorno de uma função do SAT) conforme
    o padrão e campos esperados. O retorno deverá possuir dados separados entre
    si através de pipes e o número de campos deverá coincidir com os campos
    especificados.

    O campos devem ser especificados como uma tupla onde cada elemento da tupla
    deverá ser uma tupla contendo dois elementos: o nome do campo e uma função
    de conversão a partir de uma string unicode. Por exemplo:

    .. sourcecode:: python

        >>> retorno = '123456|08000|SAT em operacao||'
        >>> resposta = analisar_retorno(retorno, funcao='ConsultarSAT')
        >>> resposta.numeroSessao
        123456
        >>> resposta.EEEEE
        u'08000'
        >>> resposta.mensagem
        u'SAT em operacao'
        >>> resposta.cod
        u''
        >>> resposta.mensagemSEFAZ
        u''
        >>> resposta.atributos.funcao
        'ConsultarSAT'
        >>> resposta.atributos.verbatim
        '123456|08000|SAT em operacao||'

    :param unicode retorno: O conteúdo **unicode** da resposta retornada pela
        função da DLL SAT.

    :param type classe_resposta: O tipo :class:`RespostaSAT` ou especialização
        que irá representar o retorno, após sua decomposição em campos.

    :param tuple campos: Especificação dos campos (nomes) e seus conversores a
        a partir do tipo ``unicode``.

    :param list campos_alternativos: Especifica conjuntos de campos alternativos
        que serão considerados caso o número de campos encontrados na resposta
        não coincida com o número de campos especificados em ``campos``.
        Para que a relação alternativa de campos funcione, é importante que
        cada relação de campos alternativos tenha um número diferente de campos.

    :param str funcao: Nome da função da DLL SAT que gerou o retorno, que
        estará disponível nos atributos adicionais à resposta.

    :param bool manter_verbatim: Se uma cópia verbatim da resposta deverá ser
        mantida nos atributos adicionais à resposta.

    :raises ErroRespostaSATInvalida: Se o retorno não estiver em conformidade
        com o padrão esperado ou se não possuir os campos especificados.

    :return: Uma instância de :class:`RespostaSAT` ou especialização.
    :rtype: satcfe.resposta.padrao.RespostaSAT

    """

    if '|' not in retorno:
        raise ErroRespostaSATInvalida('Resposta nao possui pipes separando os '
                'campos: "%s"' % as_ascii(retorno))

    partes = retorno.split('|')

    if len(partes) != len(campos):
        # procura por uma relação alternativa de campos do retorno
        for relacao_alternativa in campos_alternativos:
            if len(partes) == len(relacao_alternativa):
                relacao_campos = relacao_alternativa
                break
        else:
            raise ErroRespostaSATInvalida('Resposta nao possui o numero '
                    'esperado de campos. Esperados %d campos, mas '
                    'contem %d: "%s"' % (
                            len(campos), len(partes), as_ascii(retorno),))
    else:
        relacao_campos = campos

    resultado = {}

    def _enumerate(sequence):
        for index, value in enumerate(sequence):
            yield index, value[0], value[1]

    for indice, campo, conversor in _enumerate(relacao_campos):
        resultado[campo] = conversor(partes[indice])

    resposta = classe_resposta(**resultado)
    resposta.atributos.funcao = funcao
    resposta.atributos.verbatim = retorno if manter_verbatim else None

    return resposta
Analisa o retorno (supostamente um retorno de uma função do SAT) conforme
    o padrão e campos esperados. O retorno deverá possuir dados separados entre
    si através de pipes e o número de campos deverá coincidir com os campos
    especificados.

    O campos devem ser especificados como uma tupla onde cada elemento da tupla
    deverá ser uma tupla contendo dois elementos: o nome do campo e uma função
    de conversão a partir de uma string unicode. Por exemplo:

    .. sourcecode:: python

        >>> retorno = '123456|08000|SAT em operacao||'
        >>> resposta = analisar_retorno(retorno, funcao='ConsultarSAT')
        >>> resposta.numeroSessao
        123456
        >>> resposta.EEEEE
        u'08000'
        >>> resposta.mensagem
        u'SAT em operacao'
        >>> resposta.cod
        u''
        >>> resposta.mensagemSEFAZ
        u''
        >>> resposta.atributos.funcao
        'ConsultarSAT'
        >>> resposta.atributos.verbatim
        '123456|08000|SAT em operacao||'

    :param unicode retorno: O conteúdo **unicode** da resposta retornada pela
        função da DLL SAT.

    :param type classe_resposta: O tipo :class:`RespostaSAT` ou especialização
        que irá representar o retorno, após sua decomposição em campos.

    :param tuple campos: Especificação dos campos (nomes) e seus conversores a
        a partir do tipo ``unicode``.

    :param list campos_alternativos: Especifica conjuntos de campos alternativos
        que serão considerados caso o número de campos encontrados na resposta
        não coincida com o número de campos especificados em ``campos``.
        Para que a relação alternativa de campos funcione, é importante que
        cada relação de campos alternativos tenha um número diferente de campos.

    :param str funcao: Nome da função da DLL SAT que gerou o retorno, que
        estará disponível nos atributos adicionais à resposta.

    :param bool manter_verbatim: Se uma cópia verbatim da resposta deverá ser
        mantida nos atributos adicionais à resposta.

    :raises ErroRespostaSATInvalida: Se o retorno não estiver em conformidade
        com o padrão esperado ou se não possuir os campos especificados.

    :return: Uma instância de :class:`RespostaSAT` ou especialização.
    :rtype: satcfe.resposta.padrao.RespostaSAT