[Python] Estendere xmlrpclib.ServerProxy

Maurizio Totti maurizio.totti a gmail.com
Ven 5 Ott 2012 18:24:35 CEST


Il 05 ottobre 2012 18:13, Daniele Varrazzo <piro a develer.com> ha scritto:
> On 2012-10-05 16:43, Maurizio Totti wrote:
>>
>> Ciao,
>> sono (da sempre) alle prime armi con Python e vorrei estendere la
>> classe xmlrpclib.ServerProxy della libreria xmlrpclib (per usare un
>> proxy http se definito sulla mia linuxbox), ma sbaglio qualcosa.
>>
>> Per esempio se provo anche solo a fare così:
>>
>> Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)
>> [GCC 4.6.3] on linux2
>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>
>>>>> import xmlrpclib
>>>>> class Pluto(xmlrpclib.ServerProxy):
>>
>> ...     def __init__(self, *args, **kw):
>> ...         super(Pluto, self).__init__(self, *args, **kw)
>
>
> Nota che dovrebbe essere
>
>     super(Pluto, self).__init__(*args, **kw)
>
Ach! Hai ragione...

> ma non è questo il problema.
>
>
>
>>>>> b = Pluto("http://127.0.0.1/blog/xmlrpc.php")
>>
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>>   File "<stdin>", line 3, in __init__
>> TypeError: must be type, not classobj
>>
>> Cercando a giro ho trovato questo
>>
>>
>> http://stackoverflow.com/questions/489269/python-super-raises-typeerror-why
>> e mi è venuto il dubbio che potrebbe dipendere anche da com'è fatta
>> xmlrpclib... O forse ho semplicemente sbagliato :-)
>
>
>
> Sì, il motivo è quello: è una classe "vecchio stile". Non supporta super (e
> non si comporta in maniera educata con l'ereditarietà multipla): devi usare
>
>     xmlrpclib.ServerProxy.__init__(self, *args, **kw)
>
> (questa volta il self lo devi passare esplicito, non come col super())
>
Ed infatti funziona perfettamente! :-)

Sempre nel link di stackoverflow avevo trovato un commento che diceva
"Just do class X(object).... It should solve the problem" ed
effettivamente nel codice di xmlrpclib la definizione della classe
ServerProxy (e delle altre) non seguiva questa strada, ma da qui a
sapere come cambiare la cosa...

Per capire sono inciampato in una delle pochissime librerie "vecchio
stile" come dici o è una cosa piuttosto comune?
Esiste una xmlrpclib "new style"?

Grazie ancora
-- 
Maurizio Totti


Maggiori informazioni sulla lista Python