Topic: "wrapper" in un decoratore  (Letto 535 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Vincent

  • python habilis
  • **
  • Post: 66
  • Punti reputazione: 0
    • Mostra profilo
"wrapper" in un decoratore
« il: Febbraio 24, 2011, 18:31 »
Volevo capire meglio l'utilità di definire una funzione "wrap" dentro un decoratore.
Ho capito a cosa servono i decoratori, la funzione "wrap" mi sembra utile solo se si vogliono passare pure degli argomenti al decoratore del tipo:

[codice]def mio_decoratore(funz_da_decorare):
  def wrapper(*args):
    print("Stiamo chiamando la funzione %s con argomenti %s" % (funz_da_decorare.__name__, args))
    return funz_da_decorare(*args)
  return wrapper

@mio_decoratore
def foo(a,b):
  print("foo")
  return a*b[/codice]

E' corretto?
Per accedere alla funzione foo ed eventualmente modificarla potrei benissimo farlo senza nessun "wrapper" infatti..

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: "wrapper" in un decoratore
« Risposta #1 il: Febbraio 24, 2011, 18:51 »
Non ho ben capito il tuo dubbio... Cosa vuoi fare esattamente?

Offline Vincent

  • python habilis
  • **
  • Post: 66
  • Punti reputazione: 0
    • Mostra profilo
Re: "wrapper" in un decoratore
« Risposta #2 il: Febbraio 24, 2011, 18:57 »
No non devo fare niente, voglio capire la funzione e utilità del wrapper. Quando e perchè lo si usa?

Offline crap0101

  • python sapiens sapiens
  • ******
  • Post: 1.529
  • Punti reputazione: 5
  • Long Live The New Flesh
    • Mostra profilo
    • crap0101 washroom
Re: "wrapper" in un decoratore
« Risposta #3 il: Febbraio 25, 2011, 06:28 »
E' corretto?
Per accedere alla funzione foo ed eventualmente modificarla potrei benissimo farlo senza nessun "wrapper" infatti..
fai un esempio senza wrapper così si capisce meglio; per come ho inteso... sì, però sei comunque limitato nelle operazioni che puoi fare, diventa una sorta di 'factory function' tipo, (esempio stupido):

[codice]>>> def dec(func):
...   func.__doc__ = 'no doc'
...   func.__name__ = 'prrrrrr'
...   return func
...
>>> @dec
... def foo(x,y):return x*y
...
>>> foo
<function prrrrrr at 0x7f3ec5918d70>
>>> foo.__doc__
'no doc'
>>> foo(8,9)
72
[/codice]

Offline Vincent

  • python habilis
  • **
  • Post: 66
  • Punti reputazione: 0
    • Mostra profilo
Re: "wrapper" in un decoratore
« Risposta #4 il: Febbraio 25, 2011, 11:30 »
Si esatto, intendevo quello che dici tu. Quindi dici che perde di utilità?

Ma all'atto pratico il decoratore a cosa serve? Cioè potrei modificare la funzione senza dover creare un decoratore...In quali casi si usa il decoratore?
grazie

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: "wrapper" in un decoratore
« Risposta #5 il: Febbraio 25, 2011, 12:40 »
Ma i decoratori non servono solo a modificare funzioni. Guarda qui:
http://wiki.python.org/moin/PythonDecoratorLibrary