Como retornar um valor de função com decorador e linha

votos
2

tenho esse código

import threading
def Thread(f):
    def decorator(*args,**kargs):
        print(args) 
        thread = threading.Thread(target=f, args=args)
        thread.start()
        thread.join()
    decorator.__name__ = f.__name__
    return decorator      

@Thread
def add_item(a, b):
    return a+b


print(add_item(2,2))

mas a função não retornar o valor, sai uma maneira de obter o retorno?

Publicado 19/05/2009 em 19:46
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

A razão Noneé retornado, é porque não há nada para retornar (além do fato de que decoratornão tem uma instrução de retorno). join()sempre retorna None, de acordo com a documentação .

Para um exemplo de como se comunicar com um fio, veja este e-mail .

Se posso perguntar, porém: desde join()bloqueia o segmento de chamada, o que há para ganhar aqui?


Edit: Eu brinquei um pouco, e o seguinte é uma solução que não requer uma fila (não dizendo que é uma solução melhor Apenas diferente.):

import threading

# Callable that stores the result of calling the given callable f.
class ResultCatcher:
    def __init__(self, f):
        self.f = f
        self.val = None

    def __call__(self, *args, **kwargs):
        self.val = self.f(*args, **kwargs)

def threaded(f):
    def decorator(*args,**kargs):
        # Encapsulate f so that the return value can be extracted.
        retVal = ResultCatcher(f)

        th = threading.Thread(target=retVal, args=args)
        th.start()
        th.join()

        # Extract and return the result of executing f.
        return retVal.val

    decorator.__name__ = f.__name__
    return decorator

@threaded
def add_item(a, b):
    return a + b

print(add_item(2, 2))
Respondeu 19/05/2009 em 19:53
fonte usuário

votos
2

Isso é porque você nunca retornar um valor em sua -função "decorador".

Você tem que incluir uma variável compartilhada em seu segmento e mover o valor de retorno de sua função de rosca de volta para a -função "decorador".

Respondeu 19/05/2009 em 19:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more