2016-06-03 40 views
8

In python2.7, a seguito della pympler example:pympler solleva TypeError

from anotherfile import somefunction, somecustomclass 
from os import path, listdir 
import pandas as pd 
import gc 
from pympler import tracker, muppy, summary 

all_objects = muppy.get_objects() 
print 'all objects: ', len(all_objects) 
sum1 = summary.summarize(all_objects) 
summary.print_(sum1) 

questo è il primo codice dopo le importazioni. Ne risulta

/usr/bin/python2.7 /myprog.py 
all objects: 98755 
Traceback (most recent call last): 
File "/myprog.py", line 12, in <module> 
sum1 = summary.summarize(all_objects) 
File "/usr/local/lib/python2.7/dist-packages/pympler/summary.py", line 131, in summarize 
total_size[otype] = _getsizeof(o) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 130, in __sizeof__ 
return super(self, PandasObject).__sizeof__() 
TypeError: super() argument 1 must be type, not FrozenList 

Process finished with exit code 1 

Viene visualizzato lo stesso errore quando si tenta di inizializzare un oggetto SummaryTracker.

Sembra un errore in Pympler, ma il fatto che non riesca a trovarne alcuna menzione lo contraddice. Secondo il numero ufficiale documentation, "Pympler è scritto interamente in Python, senza dipendenze da librerie esterne. È stato testato con Python 2.5, 2.6, 2.7, 3.1, 3.2, 3.3, 3.4 su Linux, Windows e MacOS X." In realtà, in esecuzione solo il seguente codice con Python 2.7 in un nuovo file python non produce eventuali errori e le opere come previsto:

from pympler import muppy, tracker 

tr = tracker.SummaryTracker() 
tr.print_diff() 

Allora, cosa mi manca?

risposta

1

Questo è Pandas issue #12924. PandasObject.__sizeof__ ha avuto gli argomenti nell'ordine errato per la chiamata super. La correzione è stata tirata e dovrebbe essere disponibile nella prossima versione. Nel frattempo, è possibile modificare pandas/core/base.py per cambiare l'ordine degli argomenti, oppure è possibile testare la presenza del bug e correggere il metodo con una versione corretta.

+1

6 febbraio 2017: l'aggiornamento dei panda ha risolto questo problema per me. –

0

Probabilmente il codice dovrebbe funzionare solo con Python3. In this question, c'è lo stesso errore per python2 e se si guarda alla risposta accettata dice:

super() (senza argomenti) è stato introdotto nel python3:

super() -> stesso come super (classe,)

in modo che sarebbe l'equivalente python2 per classi di nuovo stile:

super (CurrentClass, auto)

0.123.

Probabilmente dovrai usare python3 se non vuoi modificare il codice della libreria.

+0

Grazie, avrei dovuto dire che ho già considerato che (aggiungerò alla domanda originale), la documentazione di Pympler afferma che "Pympler è scritto interamente in Python, senza dipendenze da librerie esterne. È stato testato con Python 2.5, 2.6, 2.7, 3.1, 3.2, 3.3, 3.4 su Linux, Windows e MacOS X. " – Darina

2

sembra essere un problema nella libreria panda. L'ho risolto modificando il codice della libreria. La pista dell'errore che si indica che la linea è sbagliato:

File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 130, in __sizeof__ 
return super(self, PandasObject).__sizeof__() 

Non vi resta che cambiare l'ordine dei parametri in questo modo:

return super(PandasObject, self).__sizeof__() 

ho fatto e sono stato in grado di eseguire normalmente il mio programma.