[Plone-IT] Incredibile Python

Giovanni Toffoli toffoli a uni.net
Mer 9 Feb 2011 16:33:52 UTC


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 <gtoffoli a 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
-------------- parte successiva --------------
È stato filtrato un testo allegato il cui set di caratteri non era
indicato...
Nome: keyarg_dict.txt
URL: <http://lists.plone.org/pipermail/plone-plone-it/attachments/20110209/41ea3c93/attachment-0002.txt>


Maggiori informazioni sulla lista Plone-IT