Domanda Risolto Esercizio python su decoratore di funzione

jr_sottomajor

Utente Silver
2 Luglio 2017
96
33
4
79
Ultima modifica:
Ciao a tutti, sto iniziando da poco a studiare i design pattern in python e mi sono imbattuto in questo esercizio:
decoratore.png

Il primissimo dubbio deriva dal punto iniziale 'lancia l'eccezione TypeError se uno o piu argomenti sono di tipo str'
Io ho abbozzato una cosa del genere:
Python:
from functools import wraps
def decora(f):
    @wraps(f)
    def wrapper(*args,**kwargs):
        for i in args:
            if not isinstance(i,str):
                raise TypeError
        for y in kwargs:
            if not isinstance(y,str):
                raise TypeError
    return wrapper

Ci sarebbe qualche altro modo per fare più semplicemente questo controllo?
Inoltre quando mi chiede di restituire una stringa formata dagli argomenti ricevuti in input e dal risultato intervallati da uno spazio, come potrei procedere?
Grazie in anticipo
Messaggio unito automaticamente:

Sono arrivato a questa conclusione:
Python:
from functools import wraps
def decora(f):
    @wraps(f)
    def wrapper(*args,**kwargs):
        outputStr = ''
        for i in args:
            if not isinstance(i,str):
                raise TypeError
            else:
                outputStr+=i+' '
        for y in kwargs:
            if not isinstance(y,str):
                raise TypeError
            else:
                outputStr+=y+' '
        res = f(*args, **kwargs)
        outputStr+=str(res)
        return outputStr
    return wrapper

@decora
def f(*args):
    return 12

print(f('il','risultato','è'))

Sembra funzionare, potrei avere un feedback riguardo la scrittura del codice? Magari se qualcosa non va bene/ si può fare meglio... grazie
 
Non ho perfettamente inteso il senso dell'esercizio, ma semanticamente equivalente al tuo è
Python:
def decora(f, *args, **kwargs):
    @wraps(f)
    def wrapper(*args, **kwargs):
        x = list(args) + list(kwargs.values())
        if any(not isinstance(i, str) for i in x): raise TypeError
        return ' '.join(x + [str(f(*args, *kwargs))]) 
    return wrapper
 
  • Mi piace
Reazioni: jr_sottomajor
Non ho perfettamente inteso il senso dell'esercizio, ma semanticamente equivalente al tuo è
Python:
def decora(f, *args, **kwargs):
    @wraps(f)
    def wrapper(*args, **kwargs):
        x = list(args) + list(kwargs.values())
        if any(not isinstance(i, str) for i in x): raise TypeError
        return ' '.join(x + [str(f(*args, *kwargs))])
    return wrapper
Si in effetti è poco chiara la traccia, grazie mille comunque