dir(re.compile(pattern))
no devuelve el patrón como uno de los elementos de las listas. A saber, vuelve:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Según el manual, se supone que 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.
Dice también que
La lista no está necesariamente completa.
¿Hay alguna manera de obtener la lista completa ? Siempre supuse que dir devuelve una lista completa pero aparentemente no ...
Además: ¿hay alguna manera de enumerar solo los atributos? ¿O solo métodos?
Editar: esto es en realidad un error en python -> supuestamente se soluciona en la rama 3.0 (y quizás también en 2.6)
dir()
o el módulo de inspección es generalmente la forma correcta de hacerlo. ¿Usó elre
módulo solo como ejemplo o desea alcanzar un objetivo especial?__dir__()
Respuestas:
Para la lista completa de atributos, la respuesta corta es: no. El problema es que los atributos se definen realmente como los argumentos aceptados por la
getattr
función incorporada. Como el usuario puede reimplementar__getattr__
, permitiendo de repente cualquier tipo de atributo, no hay una forma genérica posible de generar esa lista. Ladir
función devuelve las claves en el__dict__
atributo, es decir, todos los atributos accesibles si el__getattr__
método no se vuelve a implementar.Para la segunda pregunta, realmente no tiene sentido. En realidad, los métodos son atributos invocables, nada más. Sin embargo, podría filtrar los atributos invocables y, utilizando el
inspect
módulo, determinar los métodos, métodos o funciones de la clase.fuente
Es por eso
__dir__()
que se ha agregado el nuevo método en Python 2.6ver:
fuente
__dir
__ () es un método sobre un objeto, no una función - lea los enlaces en la respuesta y estopprint({k:getattr(ojb,k) for k in obj.__dir__()})
Aquí hay una adición práctica a las respuestas de PierreBdR y Moe:
dir()
parece ser suficiente.Para las clases de estilo antiguo , al menos podemos hacer lo que hace un módulo estándar para admitir la finalización de pestañas: además de
dir()
buscar__class__
y luego buscar__bases__
:(El código de prueba y la salida se eliminan por brevedad, pero básicamente para los objetos de estilo nuevo parece que tenemos los mismos resultados
get_object_attrs()
que paradir()
, y para las clases de estilo antiguo, la principal adición a ladir()
salida parece ser el__class__
atributo).fuente
Solo para complementar:
dir()
Es la herramienta más poderosa / fundamental. ( Más recomendado )Las soluciones que
dir()
no sean simplemente proporcionan su forma de manejar la salida dedir()
.Listando los atributos de segundo nivel o no, es importante hacer el cribado usted mismo, porque a veces es posible que desee tamizar los vars internos con guiones bajos
__
, pero a veces es posible que necesite la__doc__
cadena de documentación.__dir__()
ydir()
devuelve contenido idéntico.__dict__
ydir()
son diferentes__dict__
devuelve contenido incompleto.IMPORTANTE :
__dir__()
el autor a veces puede sobrescribirlo con una función, valor o tipo para cualquier propósito.Aquí hay un ejemplo:
TypeError: el descriptor
__dir__
del'object'
objeto necesita un argumentoEl autor de PyTorch modificó el
__dir__()
método a algo que requiere un argumento. Esta modificación hacedir()
fallar.Si desea un esquema confiable para atravesar todos los atributos de un objeto, recuerde que cada estándar pitónico puede ser anulado y puede no cumplirse , y cada convención puede no ser confiable.
fuente
Así es como lo hago, útil para objetos personalizados simples a los que sigues agregando atributos:
Dado un objeto creado con
obj = type("Obj",(object,),{})
, o simplemente:Agrega algunos atributos:
luego, para obtener un diccionario con solo los atributos personalizados:
fuente