El comportamiento de Python super () no es confiable


Por alguna razón, el método super() no siempre se comporta como se espera, optando por devolver:

TypeError('super(type, obj): obj must be an instance or subtype of type)'

Entiendo lo que el error significa. No entiendo por qué se trata de un error. Aquí está el fragmento de código que se está rompiendo. Todos los objetos del sistema son nuevos objetos de estilo.

Lo realmente interesante es que este error no siempre se muestran. No se que lo esta causando. El método super() en {[5] } está pasando la clase Retrieval, y luego sí mismo como un objeto,que es, hasta donde yo sé, exactamente cómo super() se supone que debe ser invocado.

¿Algún pensamiento?

En el archivo DBConnection.py:

class DBAdminConnection(object):
    def __init__(self):
        self.user = DBUserConnection().user 
        self.submissions = DBSubmissionConnection()

En el archivo Retrieval.py

class Retrieval(DBConnection.DBAdminConnection): 
    def __init__(self, username=None, password=None, unique_key=None):
        super(Retrieval,self).__init__()
        if username and password:
            self.username = username
            self.user.login(username,password, config.DATABASE)
            if self.user.error:
                raise UserLoginError(username)
        self.unique_key = unique_key
Author: Ethan Furman, 2012-03-15

5 answers

¿Estás recargando módulos de alguna manera en medio de las cosas? Si es así, eso puede explicar este error.

isinstance(self,DBAdminConnection) puede convertirse en false después de recargar módulos debido a los cambios en las referencias de memoria, aparentemente.

Editar: si está ejecutando su web.py aplicación bajo mod_wsgi, asegúrese de que está deshabilitando autoreload:

app = web.application(urls, globals(), autoreload=False)
 57
Author: Eduardo Ivanec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-15 15:44:42

Si está utilizando reload() como parte de su flujo de trabajo, aparentemente también necesita usar super(self.__class__, self).__init__ para inicializar la herencia.

Sospecho que encontrará que este error coincide con id(self.__class__) ==id(Retrieval) fallando.

 12
Author: Hal Meyers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 21:59:54

No estoy seguro de por qué ocurre el error, pero como ayuda para la depuración, podría envolver la llamada a super en un bloque try/except y hacer un volcado de datos cuando se genere la excepción. Algo como esto:

class Retrieval(DBConnection.DBAdminConnection): 
    def __init__(self, username=None, password=None, unique_key=None):
        try:
            super(Retrieval,self).__init__()
        except TypeError, e:
            print "Failure initialising Retrieval --> self: %r"
            raise
        if username and password:
            self.username = username
            self.user.login(username,password, config.DATABASE)
            if self.user.error:
                raise UserLoginError(username)
        self.unique_key = unique_key
 1
Author: Ethan Furman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-15 15:27:01

Acabo de tener el mismo problema, ejecutar mi código en jupyter notebook. Estaba usando reload, así que reinicié mi kernel para dar seguimiento a la respuesta de Eduardo Ivanec para tratar de ver si este era el problema. Entonces mi código se rompió. Descubrí que mi problema estaba relacionado con varias capas de herencia, donde la capa inferior estaba definida por encima de la segunda capa inferior en el módulo.

class MyClass1(object):
'''example class 1'''

class MyClass2(MyClass1):
'''example class 2'''
    def __init__(self):
    super(MyClass2, self).__init__()

class MyClass4(MyClass3):
'''example class 4 - no __init__ definition'''

class MyClass3(MyClass2):
'''example class 3 - no __init__ definition'''

Cuando moví MyClass4 debajo de MyClass3, solucionó el problema.

Esto es probablemente un error de novato, por lo que probablemente no resolverá la causa del problema original anterior, pero pensé que publicaría en caso de que haya otros novatos por ahí, como yo, que están cometiendo el mismo error.

(Disculpas si mi estilo es incorrecto, este es mi primer post en Stack Overflow. :))

 1
Author: ahnastin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-20 20:08:10

Tuve el mismo error y luego me di cuenta de que tenía clase duplicada (mi error) dentro de la misma file.py. Error desapareció cuando cambié el nombre de la segunda clase A a la clase B

#Just some example below, not real code
class A (object):

    def fun(self):
        super(A, self).fun()

class A (object): ##This second class with same name (A) caused the error

   def some_fun(self,x,y):
 1
Author: Bernard Too,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-03 00:17:46