Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Definir retorno de resultado de função ou método

Tenho uma função:

def PegaDadosPartes(dados):
    distribuicaoPara = VerificaDist(partes)
    dados.append(str(distribuicaoPara) + " @")
    for x in range(len(partes)):
            dados.append(partes[x] + '@')
    del partes[0:len(partes)]
    return dados

Ela recebe um conjunto de dados (lista 'partes') de outra função, e alimenta uma outra lista ('dados') com essas informações, SENDO QUE a variável 'distribuicaoPara' chama a função 'VerificaDist(partes)' para obter seu valor.

Esse valor depende de uma série de tratamentos. Dentre eles, verificar se em 'partes' há CNPJ's ou CPF's, e tratar diferenciadamente caso a caso, assim:

def VerificaDist(partes):
    posicao = []
    temCnpj = 0
    for x in range(len(partes)):
        verificaOutroCnpj = re.search("\d{2}.\d{3}.\d{3}/\d{4}-\d{2}", partes[x]) 
        if verificaOutroCnpj:
            posicao.append("CNPJ " + verificaOutroCnpj.group())
            temCnpj = temCnpj + 1
        verificaCpf = re.search("\d{3}.\d{3}.\d{3}-\d{2}", partes[x]) #Se não achou CNPJ, busca CPF.
        if verificaCpf:
            posicao.append("CPF " + verificaCpf.group())
        if temCnpj > 0:
            Caso1(posicao) #Primeiro caso: consta CNPJ.
        else:
            Caso2(posicao) #Segundo caso: consta CPF.

Tanto em um quanto no outro caso, as funções de tratamento irão "fatiar" a variável, pois os critérios de tratamento são diferentes. No CNPJ o dígito antes da "/" determina o responsável. No CPF, o oitavo dígito define isso. A função final faz isso:

def TrataDistribuicao(alvos): #("Alvos" são as partes "fatiadas" da informação)
    analisa = open('C:\\Regras.txt', 'r') #É o arquivo que contém as regras de designação de responsável, tipo "Se o dígito é 8 responsável fulano, se 7 cicrano" e assim por diante...
    regrasDeDistribuicao = analisa.readlines()
    for x in range(len(regrasDeDistribuicao)):
        regrasDeDistribuicao[x] = regrasDeDistribuicao[x].split(',')
    for x in range(len(regrasDeDistribuicao)):
        if alvos[0] == regrasDeDistribuicao[x][0]:
            distribuicaoPara = str("Distribuir para " + regrasDeDistribuicao[x][1] )
        elif alvos[1] == regrasDeDistribuicao[x][0]:
            distribuicaoPara = str("Distribuir para " + regrasDeDistribuicao[x][1])
        elif alvos[2] == regrasDeDistribuicao[x][0]:
            distribuicaoPara = str("Distribuir para " + regrasDeDistribuicao[x][1] )
        elif alvos[3] == regrasDeDistribuicao[x][0]:
            distribuicaoPara = str("Distribuir para " + regrasDeDistribuicao[x][1])
    analisa.close()

Ocorre que, no final de tudo isso, não estou conseguindo "setar" a variável "distribuiçãoPara". Como fazer?

3 respostas

A função VerificaDist não tem cláusla return e por isso ela retorna o valor padrão None. Defina nesta função qual o valor que ela deve retornar para cada situação que você deveria tratar e a variável distribuicaoPara receberá este valor.

Mesmo que esse valor venha de uma terceira função? Ou eu devo colocar um return ao final de cada função?

solução!

Sim, mesmo que ela venha de outra função. Se a função VerificaDist depende do valor de outra, não faz diferença para quem a chama (a VerificaDist).

Vc deve usar o return sempre que já tiver um valor a ser retornado. A função pode ter várias cláusas return, uma para cada trecho do código em que já existir um valor a ser retornado.

A primeira vez que a função encontrar o return, ela retornara com o valor que estiver após ele (mesmo que existam outros após ele), o que pode ser uma expressão, variável, chamda de uma função ou pode até não haver nada. Neste último caso o valor retornado será None

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software