Dado que el interés de este tema es obtener nombres totalmente calificados, aquí hay una trampa que se produce cuando se utilizan importaciones relativas junto con el módulo principal existente en el mismo paquete. Ej .:
$ mkdir -p /tmp/fqname/foo
$ touch /tmp/fqname/foo/__init__.py
$ cat<<END > /tmp/fqname/foo/bar.py
> from baz import Baz
> print Baz.__module__
> END
$ cat<<END > /tmp/fqname/foo/baz.py
> class Baz: pass
> END
$ cat <<END > /tmp/fqname/main.py
> import foo.bar
> from foo.baz import Baz
> print Baz.__module__
> END
$ cat <<END > /tmp/fqname/foo/hum.py
> import bar
> import foo.bar
> END
$ PYTHONPATH=/tmp/fqname python /tmp/fqname/main.py
foo.baz
foo.baz
$ PYTHONPATH=/tmp/fqname python /tmp/fqname/foo/bar.py
baz
$ PYTHONPATH=/tmp/fqname python /tmp/fqname/foo/hum.py
baz
foo.baz
Cuando las importaciones de barras usando hum ruta relativa, bar Baz.__module__
ve simplemente como "Baz", pero en la segunda importación que utiliza el nombre completo, la barra ve lo mismo que "foo.baz".
Si persiste el nombre completo en alguna parte, es mejor evitar las importaciones relativas para esas clases.
+1 ¡Bonito! ¿Por qué no agregas '__package__'? –
Esto parece devolver el módulo donde se definió la barra, no donde se definió la barra. Si el propósito del registro es saber exactamente qué tipo de objeto era, entonces esto no parece ayudar. –
Debe ser 'o .__ class __.__ module__', creo ... –