[Python-es] Saber si un atributo es un descriptor

Chema Cortes pych3m4 en gmail.com
Mar Dic 15 05:30:04 EST 2015


El mar., 15 dic. 2015 a las 10:40, Kiko (<kikocorreoso en gmail.com>) escribió:

>
> Como diría ese gran estadista, "It is very difficult, todo esto".
>

Más que complicado, los descriptores es lo que da a python toda su "magia".


>
> Creo que lo anterior resume, creo, lo que quiero:
>
> ¿Puedo comprobar si un descriptor funciona como un atributo de clase o
> como una *property* con el siguiente código?
> Cuando me refiero a descriptores en mi contexto de ignorancia supina estoy
> refiriéndome a cosas como *int.numerator, complex.real,...*
>
> *import types*
> *a = 1 + 2j*
>
>
>
> *for attr in dir(a):    if isinstance(getattr(type(a), attr), *
>
> *                      (types.GetSetDescriptorType,
> types.MemberDescriptorType)):        print(attr)*
>
> Es decir, ¿un descriptor que funciona como una *property*, atributo,...,
> solo puede ser instancia de* types.GetSetDescriptorType *o*
> types.MemberDescriptorType?*
>
>
Creo que empiezo a entender lo que quieres. Lo que denominas "propiedad", o
simplemente "descriptor", sería lo que se conoce como "descriptor de
datos". Son los descriptores a los que se pueden asignar valores, para
entendernos. Para ser "descriptor de datos" basta con tener un método
"__set__":

props = [attr for attr in dir(a) if hasattr(type(a), attr) and
hasattr(getattr(type(a),attr), "__set__")]

Los tipos "GetSetDescriptorType" y "MemberDescriptorType" son usados por
los módulos de extensión, los que se compilan desde C en el caso de
CPython. Pero es mucho más genérico indagar por atributos "__get__" y
"__set__" para saber si son descriptores, además de funcionar siempre.


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20151215/84ff64a7/attachment.html>


Más información sobre la lista de distribución Python-es