Cari plonisti italiani, prima di fare un post su una mailing list internazionale, e magari farci una grigia, sottopongo a voi una recente esperienza.

Quando si usa un dict come valore default di un keyword argument, e si modifica il valore di quella variabile all'interno del metodo, Python ne ricorda il valore da una chiamata all'altra !!

Allego, come file di testo, un esempio commentato, che in realtà era un .py. Dato che non so se gli attachment vengono conservarti in questa lista, ne riporto il contenuto anche in linea. L'esempio fa riferimento ad un external method in Plone 3, richiamato da un Python script. Ma ottengo lo stesso risultato anche usando solo l'interprete Python, oppure Idle. Solo che, nel caso di Zope/Plone, il valore della variabile sembra memorizzato nel database, dato che viene ricordato anche se si riavvia l'istanza.

A saperlo, non è una cosa grave, ma io ho perso parecchie ore a diagnosticare un malfunzionamento misterioso. Secondo voi è un bug di Python (e quindi di Zope/Plone), o un comportamento previsto?

Grazie e ciao, Giovanni

-----
"""
Giovanni Toffoli <gtoff...@uni.net>, 110209

create an external method so defined:
Id: keyarg_dict
Title: test the use of Python dict as keyword argument
Module Name: myproduct.keyarg_dict
Function Name: test

then call it 2 times from a Python script as follows:
print context.keyarg_dict()
print context.keyarg_dict()
return printed

I get the following results:
{}
{'a': 1}

subsequent times, if I execute the script,
even if I restart the instance, I get:
{'a': 1}
{'a': 1}
"""

def test(arg={}):
   out = repr(arg)
   if not arg:
       arg['a'] = 1
   return out
"""
Giovanni Toffoli <gtoff...@uni.net>, 110209

create an external method so defined:
Id: keyarg_dict
Title: test the use of Python dict as keyword argument
Module Name: myproduct.keyarg_dict
Function Name: test

then call it 2 times from a Python script as follows:
print context.keyarg_dict()
print context.keyarg_dict()
return printed

I get the following results:
{}
{'a': 1}

subsequent times, if I execute the script,
even if I restart the instance, I get:
{'a': 1}
{'a': 1}
"""

def test(arg={}):
   out = repr(arg)
   if not arg:
       arg['a'] = 1
   return out

_______________________________________________
Plone-IT mailing list
Plone-IT@lists.plone.org
https://lists.plone.org/mailman/listinfo/plone-it
http://plone-regional-forums.221720.n2.nabble.com/Plone-Italy-f221721.html

Rispondere a