has exceptions example error custom attribute all python attributeerror

python - exceptions - AttributeError: el objeto ''module'' no tiene ningún atributo



raise python (5)

Tengo dos módulos de python:

a.py

import b def hello(): print "hello" print "a.py" print hello() print b.hi()

b.py

import a def hi(): print "hi"

Cuando ejecuto a.py , obtengo:

AttributeError: ''module'' object has no attribute ''hi''

¿Qué significa el error? ¿Cómo lo arreglo?


El problema es la dependencia circular entre los módulos. a importaciones b y b importaciones a . Pero uno de ellos debe cargarse primero; en este caso, Python termina inicializando el módulo a antes de que b y b.hi() todavía no existan cuando intenta acceder a él en a .


Experimenté este error porque el módulo no se importó realmente. El código se veía así:

import a.b, a.c # ... something(a.b) something(a.c) something(a.d) # My addition, which failed.

La última línea resultó en un AttributeError . La causa fue que no me di cuenta de que los submódulos de a ( ab y ac ) se importaban explícitamente , y supuse que el extracto importado en realidad importaba a .


Obtuve este error al hacer referencia a una enumeración que se importó de forma incorrecta, por ejemplo:

from package import MyEnumClass # ... # in some method: return MyEnumClass.Member

Importación correcta:

from package.MyEnumClass import MyEnumClass

Espero que ayude a alguien


También he visto este error al nombrar inadvertidamente un módulo con el mismo nombre que uno de los módulos estándar de Python. Por ejemplo, tuve un módulo llamado commands que también es un módulo de biblioteca de Python. Resultó difícil de rastrear, ya que funcionaba correctamente en mi entorno de desarrollo local pero falló con el error especificado cuando se ejecutaba en Google App Engine.


Tiene importaciones mutuas de alto nivel, lo cual es casi siempre una mala idea.

Si realmente debe tener importaciones mutuas en Python, la forma de hacerlo es importarlas dentro de una función:

# In b.py: def cause_a_to_do_something(): import a a.do_something()

Ahora a.py puede import b forma segura import b sin causar problemas.

(A primera vista, podría parecer que cause_a_to_do_something() sería enormemente ineficiente porque realiza una import cada vez que lo llama, pero de hecho, el trabajo de importación solo se realiza la primera vez. La segunda y las siguientes veces que importa un módulo, es una operación rápida)