Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: unbound method "method name" must be called with "Class name" instance as first argument (got str instance instead)

Tags:

python

I think this should be a simple question to answer.

I have the next classes:

class GruposHandler(webapp.RequestHandler):
    def get(self):
        self.obtenerPagina()

    def obtenerPagina(self, pOpcion = None, pMensajeInformacion = None):
        opcion = pOpcion if pOpcion is not None else self.request.get('opcion') 
        usuario = obtenerUsuario()
        rsGrupos = obtenerGruposAll() 
        listaOtrosGrupos = []
        listaGruposSuscriptos = []
        blah blah ........

class NuevoGrupoHandler(webapp.RequestHandler): 
    def post(self):
        nombre = self.request.get('nombre')
        descripcion = self.request.get('descripcion')
        obj = Grupo.get_by_key_name(nombre)
        if obj:
            doRender(self, 'nuevo_grupo.html', {'mensaje_descripcion':'Ya existe un grupo con ese nombre.'})
        else:
            grupo = model.Grupo(key_name = nombre, nombre=nombre, descripcion = descripcion);
            grupo.put()
            grupoHandler = GruposHandler
            grupoHandler.obtenerPagina("gruposMios", 'Informacion: un nuevo grupo fue agregado.')

but it seems that method obtenerPagina from GruposHandler is not being called properly. This is the stacktrace I get:

TypeError: unbound method obtenerPagina() must be called with GruposHandler instance as first argument (got str instance instead)

What I'm doing wrong?

Thanks in advance...

like image 1000
Lucas Avatar asked Feb 12 '12 01:02

Lucas


1 Answers

grupoHandler = GruposHandler

==>

grupoHandler = GruposHandler()

UPDATE:

GruposHandler.obtenerPagina() method accepts 3 arguments:
self, pOpcion=None and pMensajeInformacion=None.

Since 2 of them are optional, you don't get:

TypeError: ... takes exactly 3 arguments (2 given)

when calling it like this:

GruposHandler.obtenerPagina("gruposMios", 'Informacion: ...')

Instead GruposHandler.obtenerPagina() interprets arguments like this:

self="gruposMios", pOpcion='Informacion: ...', pMensajeInformacion=None

and raises:

TypeError: ... must be called with instance (got str instance instead)

To get rid of the exception, you need to call this method from instance:

GruposHandler().obtenerPagina("gruposMios", 'Informacion: ...')

and self will be passed to obtenerPagina implicitly.

like image 61
Misha Akovantsev Avatar answered Oct 16 '22 09:10

Misha Akovantsev