/ / Iterando los atributos de un objeto usando dir y getattr rigurosamente - python-3.x

Iterando los atributos de un objeto usando dir y getattr rigurosamente - python-3.x

Estoy intentando acceder mediante programación a todos los campos de algún objeto de Python3 utilizando una combinación de dir y getattr. Pseudocódigo a continuación:

x = some_object()
for i in dir(x):
print(str(getattr(x, i)))

Sin embargo, los documentos de Python (https://docs.python.org/2/library/functions.html#dir) en dir es MUY vago:

Nota: porque dir () se suministra principalmente comoes conveniente para su uso en una solicitud interactiva; trata de proporcionar un conjunto interesante de nombres más de lo que intenta proporcionar un conjunto de nombres definido de manera rigurosa o consistente, y su comportamiento detallado puede cambiar entre las versiones.

Mis preguntas: 1) ¿Hay una manera de lograr lo anterior más rigurosamente que usando dir? 2) ¿Qué significa "conjunto interesante de nombres" y cómo se calcula?

Respuestas

0 para la respuesta № 1
  1. ¿Mas o menos?

Con la costumbre __getattr__ y __getattribute__ implementaciones, un objeto puede responder dinámicamente a las solicitudes de cualquier atributo. Usted podría tener un objeto que tiene cada atributo, o un objeto que al azar tiene o no tiene el foo atribuye con un 50% de probabilidad cada vez que lo mires. Si sabes como funciona un objeto. __getattr__ y __getattribute__ y sabes que responden a una lista finita de nombres de atributos, entonces puedes escribir tu propia versión de dir eso enumera todo, pero incluso el manejo de los tipos básicos integrados requiere un número incómodo de casos. Puedes ver el dir implementación en Objects/object.c.

  1. La documentación da una explicación de qué atributos se consideran interesantes:

    • Si el objeto es un objeto de módulo, la lista contiene los nombres de los atributos del módulo.
    • Si el objeto es un objeto de tipo o clase, la lista contiene los nombres de sus atributos y recursivamente los atributos de sus bases.
    • De lo contrario, la lista contiene los nombres de los atributos del objeto, los nombres de los atributos de su clase y recursivamente los atributos de las clases base de su clase.

Por "atributos", esta documentación se refiere principalmente a las claves de su __dict__. También hay algo de manejo para __members__ y __methods__; esos están en desuso, y no recuerdo lo que hacen.