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

2015-12-15 Por tema Kiko
El 15 de diciembre de 2015, 4:11, Chema Cortes  escribió:

>
>
> El lun., 14 dic. 2015 a las 22:24, Kiko ()
> escribió:
>
>>
>>
>>> *import types*





 *a = 1for attr in dir(a):if isinstance(getattr(type(a), attr),
 types.GetSetDescriptorType):print(attr)*
 Y el resultado sería:






 *denominatorimagnumeratorreal*

>>>
>>> Vaya, acabo de cambiar *a* para que sea *complex* en lugar de *int* y
>>> mi código de encima no me devuelve *img* y *real*, que son descriptores
>>> de *complex*...
>>>
>>> :-(
>>>
>>
>> Esto parece que sí funciona:
>>
>> *import types*
>> *a = 1 + 2j*
>>
>>
>>
>> *for attr in dir(a):if isinstance(getattr(type(a), attr), *
>>
>>
>> *  (types.GetSetDescriptorType,
>> types.MemberDescriptorType)):print(attr)*
>> Lo anterior parece que sí funciona. No entiendo muy bien la diferencia
>> entre GetSetDescriptor y MemberDescriptor.
>> ¿Sería lo anterior lo adecuado para resolver el problema?
>>
>
> Oficialmente, un descriptor es todo objeto con, al menos, un método
> "__get__":
>
> hasattr(attr, "__get__")
>

Eso había leído, sí, y así es. Pero lo que me confunde es cuando aquí
definen como se invocan (TL, lo llaman como un atributo):
https://docs.python.org/3.5/howto/descriptor.html#invoking-descriptors

Aquí definen las *properties*, que creía que era lo que buscaba en un
principio:
https://docs.python.org/3.5/howto/descriptor.html#properties
Pero algunos atributos que actúan como *properties* no son instancias de
*property*...

Lo que estoy buscando, y no me he explicado bien por desconocimiento, como
muchas otras veces, es saber si 'algo' actúa como una *property*, es decir,
la puedo invocar como un atributo pero no es un atributo.

Por ejemplo:






* In [1]: type(int.from_bytes)Out[1]: builtin_function_or_methodIn [2]:
type(int.numerator)Out[2]: getset_descriptor*
De ahí pensaría que* from_bytes* es un método (y también es un descriptor,
como bien indicas):

I



*n [3]: int.to_bytes.__get__Out[3]: In [4]: int.numerator.__get__Out[4]:
*

Lo que busco es si un descriptor se puede llamar como un atributo (como si
fuera una property). Lo siguiente me devuelve *False*:

In [5]: isinstance(int.numerator, property)
Out[5]: False

In [6]: callable(int.numerator)
Out[6]: False

Lo que me indica que* numerator* no es una *property* pero tampoco en un
atributo al uso (un atributo al uso también deviuelve *False* con las dos
comprobaciones anteriores).

Por tanto, vuelvo a mi pregunta inicial reformulada gracias a las
indicaciones de Chema:

¿Puedo comprobar si un descriptor funciona como un atributo de clase con el
siguiente código?

*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?*
A ver si ahora he atinado más con la pregunta.

Disculpas por el cambalache y gracias, Chema.
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


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

2015-12-15 Por tema Chema Cortes
El mar., 15 dic. 2015 a las 9:22, Kiko () escribió:

> El 15 de diciembre de 2015, 4:11, Chema Cortes 
> escribió:
>
>>
>>
>> El lun., 14 dic. 2015 a las 22:24, Kiko ()
>> escribió:
>>
>>>
>>>
 *import types*
>
>
>
>
>
> *a = 1for attr in dir(a):if isinstance(getattr(type(a), attr),
> types.GetSetDescriptorType):print(attr)*
> Y el resultado sería:
>
>
>
>
>
>
> *denominatorimagnumeratorreal*
>

 Vaya, acabo de cambiar *a* para que sea *complex* en lugar de *int* y
 mi código de encima no me devuelve *img* y *real*, que son
 descriptores de *complex*...

 :-(

>>>
>>> Esto parece que sí funciona:
>>>
>>> *import types*
>>> *a = 1 + 2j*
>>>
>>>
>>>
>>> *for attr in dir(a):if isinstance(getattr(type(a), attr), *
>>>
>>>
>>> *  (types.GetSetDescriptorType,
>>> types.MemberDescriptorType)):print(attr)*
>>> Lo anterior parece que sí funciona. No entiendo muy bien la diferencia
>>> entre GetSetDescriptor y MemberDescriptor.
>>> ¿Sería lo anterior lo adecuado para resolver el problema?
>>>
>>
>> Oficialmente, un descriptor es todo objeto con, al menos, un método
>> "__get__":
>>
>> hasattr(attr, "__get__")
>>
>
> Eso había leído, sí, y así es. Pero lo que me confunde es cuando aquí
> definen como se invocan (TL, lo llaman como un atributo):
> https://docs.python.org/3.5/howto/descriptor.html#invoking-descriptors
>
> Aquí definen las *properties*, que creía que era lo que buscaba en un
> principio:
> https://docs.python.org/3.5/howto/descriptor.html#properties
> Pero algunos atributos que actúan como *properties* no son instancias de
> *property*...
>
> Lo que estoy buscando, y no me he explicado bien por desconocimiento, como
> muchas otras veces, es saber si 'algo' actúa como una *property*, es
> decir, la puedo invocar como un atributo pero no es un atributo.
>
> Por ejemplo:
>
>
>
>
>
>
> * In [1]: type(int.from_bytes)Out[1]: builtin_function_or_methodIn [2]:
> type(int.numerator)Out[2]: getset_descriptor*
> De ahí pensaría que* from_bytes* es un método (y también es un
> descriptor, como bien indicas):
>
> I
>
>
>
> *n [3]: int.to_bytes.__get__Out[3]:  method_descriptor object at 0x01283328>In [4]: int.numerator.__get__Out[4]:
> *
>
> Lo que busco es si un descriptor se puede llamar como un atributo (como si
> fuera una property). Lo siguiente me devuelve *False*:
>
> In [5]: isinstance(int.numerator, property)
> Out[5]: False
>
> In [6]: callable(int.numerator)
> Out[6]: False
>
> Lo que me indica que* numerator* no es una *property* pero tampoco en un
> atributo al uso (un atributo al uso también deviuelve *False* con las dos
> comprobaciones anteriores).
>
> Por tanto, vuelvo a mi pregunta inicial reformulada gracias a las
> indicaciones de Chema:
>
> ¿Puedo comprobar si un descriptor funciona como un atributo de clase con
> el siguiente código?
>
>
> *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?*
> A ver si ahora he atinado más con la pregunta.
>
> Disculpas por el cambalache y gracias, Chema.
>

Si has oído que python usa "duck types", este sería el caso ilustrativo.
Descriptores son todo objeto que tenga un atributo "__set__" o "__get__",
independiente de como haya sido creado. Y está implícito en el
funcionamiento de python hasta el punto de que puedes crear propiedades
como descriptores, sin derivar necesariamente desde property. Así mismo, un
"callable" es todo objeto que tenga un atributo "__call__" que, además de
incluir funciones y métodos, también son las clases que usan "__call__"
para la creación de instancias (No confundas 'descriptor' con 'callable').

Se ha intentado formalizar el "duck typing" mediantes clases abstractas
(ver módulo 'abc').

Si no te aclaras, lo mejor es que pongas algo de código de lo que quieres y
te podría dar alguna pista.



>
>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


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

2015-12-15 Por tema Kiko
El 15 de diciembre de 2015, 10:26, Chema Cortes 
escribió:

>
>
> El mar., 15 dic. 2015 a las 9:22, Kiko ()
> escribió:
>
>> El 15 de diciembre de 2015, 4:11, Chema Cortes 
>> escribió:
>>
>>>
>>>
>>> El lun., 14 dic. 2015 a las 22:24, Kiko ()
>>> escribió:
>>>


> *import types*
>>
>>
>>
>>
>>
>> *a = 1for attr in dir(a):if isinstance(getattr(type(a), attr),
>> types.GetSetDescriptorType):print(attr)*
>> Y el resultado sería:
>>
>>
>>
>>
>>
>>
>> *denominatorimagnumeratorreal*
>>
>
> Vaya, acabo de cambiar *a* para que sea *complex* en lugar de *int* y
> mi código de encima no me devuelve *img* y *real*, que son
> descriptores de *complex*...
>
> :-(
>

 Esto parece que sí funciona:

 *import types*
 *a = 1 + 2j*



 *for attr in dir(a):if isinstance(getattr(type(a), attr), *


 *  (types.GetSetDescriptorType,
 types.MemberDescriptorType)):print(attr)*
 Lo anterior parece que sí funciona. No entiendo muy bien la diferencia
 entre GetSetDescriptor y MemberDescriptor.
 ¿Sería lo anterior lo adecuado para resolver el problema?

>>>
>>> Oficialmente, un descriptor es todo objeto con, al menos, un método
>>> "__get__":
>>>
>>> hasattr(attr, "__get__")
>>>
>>
>> Eso había leído, sí, y así es. Pero lo que me confunde es cuando aquí
>> definen como se invocan (TL, lo llaman como un atributo):
>> https://docs.python.org/3.5/howto/descriptor.html#invoking-descriptors
>>
>> Aquí definen las *properties*, que creía que era lo que buscaba en un
>> principio:
>> https://docs.python.org/3.5/howto/descriptor.html#properties
>> Pero algunos atributos que actúan como *properties* no son instancias de
>> *property*...
>>
>> Lo que estoy buscando, y no me he explicado bien por desconocimiento,
>> como muchas otras veces, es saber si 'algo' actúa como una *property*,
>> es decir, la puedo invocar como un atributo pero no es un atributo.
>>
>> Por ejemplo:
>>
>>
>>
>>
>>
>>
>> * In [1]: type(int.from_bytes)Out[1]: builtin_function_or_methodIn [2]:
>> type(int.numerator)Out[2]: getset_descriptor*
>> De ahí pensaría que* from_bytes* es un método (y también es un
>> descriptor, como bien indicas):
>>
>> I
>>
>>
>>
>> *n [3]: int.to_bytes.__get__Out[3]: > method_descriptor object at 0x01283328>In [4]: int.numerator.__get__Out[4]:
>> *
>>
>> Lo que busco es si un descriptor se puede llamar como un atributo (como
>> si fuera una property). Lo siguiente me devuelve *False*:
>>
>> In [5]: isinstance(int.numerator, property)
>> Out[5]: False
>>
>> In [6]: callable(int.numerator)
>> Out[6]: False
>>
>> Lo que me indica que* numerator* no es una *property* pero tampoco en un
>> atributo al uso (un atributo al uso también deviuelve *False* con las
>> dos comprobaciones anteriores).
>>
>> Por tanto, vuelvo a mi pregunta inicial reformulada gracias a las
>> indicaciones de Chema:
>>
>> ¿Puedo comprobar si un descriptor funciona como un atributo de clase con
>> el siguiente código?
>>
>>
>> *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?*
>> A ver si ahora he atinado más con la pregunta.
>>
>> Disculpas por el cambalache y gracias, Chema.
>>
>
> Si has oído que python usa "duck types", este sería el caso ilustrativo.
> Descriptores son todo objeto que tenga un atributo "__set__" o "__get__",
> independiente de como haya sido creado. Y está implícito en el
> funcionamiento de python hasta el punto de que puedes crear propiedades
> como descriptores, sin derivar necesariamente desde property. Así mismo, un
> "callable" es todo objeto que tenga un atributo "__call__" que, además de
> incluir funciones y métodos, también son las clases que usan "__call__"
> para la creación de instancias (No confundas 'descriptor' con 'callable').
>
> Se ha intentado formalizar el "duck typing" mediantes clases abstractas
> (ver módulo 'abc').
>
> Si no te aclaras, lo mejor es que pongas algo de código de lo que quieres
> y te podría dar alguna pista.
>

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

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), *

* 

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

2015-12-15 Por tema Chema Cortes
El mar., 15 dic. 2015 a las 10:40, Kiko () 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
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


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

2015-12-15 Por tema Chema Cortes
El mar., 15 dic. 2015 a las 11:30, Chema Cortes ()
escribió:

> El mar., 15 dic. 2015 a las 10:40, Kiko ()
> 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".
>
>

En mi viejo blog tengo una serie de artículos explicando el funcionamiento
de los descriptores. Voy a migrarlo ya, pero aún se puede encontrar en su
vieja ubicación:

http://ch3m4.org/blog/tag/descriptor/


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


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

2015-12-15 Por tema Kiko
El 15 de diciembre de 2015, 11:42, Chema Cortes 
escribió:

>
>
> El mar., 15 dic. 2015 a las 11:30, Chema Cortes ()
> escribió:
>
>> El mar., 15 dic. 2015 a las 10:40, Kiko ()
>> 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".
>>
>>
>
> En mi viejo blog tengo una serie de artículos explicando el funcionamiento
> de los descriptores. Voy a migrarlo ya, pero aún se puede encontrar en su
> vieja ubicación:
>
> http://ch3m4.org/blog/tag/descriptor/
>

Pues tendré que ponerme a estudiar para poder entender un poco mejor todas
las interioridades.

Gracias, Chema.


>
>
>
> --
> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
> http://ch3m4.org/blog
>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


[Python-es] Fwd: Beta Público para Stack Overflow en Español

2015-12-15 Por tema Juan Luis Cano

Hola a todos:

Se hace saber que, después de tres años de incubación y espera, se acaba 
de abrir al público Stack Overflow en Español.


Esta es una oportunidad excelente para construir una base de datos de 
contenido y conocimientos de calidad en nuestro idioma. Os animo a todos 
a que participéis y a que extendáis esta invitación a otras comunidades, 
y naturalmente otros lenguajes. Sobre todo creo que será útil para la 
gente que esté aprendiendo.


Durante las primeras semanas estaré bastante activo contestando dudas 
del lenguaje Python, sus bibliotecas científicas y algún qué otro tema :)


Aquí un artículo que describe por qué esto es una buena idea (en inglés, 
claro):


https://blog.stackoverflow.com/2014/02/cant-we-all-be-reasonable-and-speak-english/

(Creo que el título es bastante explícito)

Un saludo a todos y nos vemos en Desbordamiento de Pila ;)

Juanlu


 Forwarded Message 
Subject:Beta Público para Stack Overflow en Español
Date:   Tue, 15 Dec 2015 18:39:05 +
From:   Stack Exchange Area 51 
Reply-To:   do-not-re...@stackexchange.com
To: juanlu...@gmail.com



Stack Exchange
Stack Exchange

¡Tenemos unas buenas noticias que anunciar! El sitio Stack Overflow en 
Español  ahora está abierto al público. 
Felicidades y bienvenidos a su nuevo sitio.


Tal vez te uniste a la propuesta de este sitio durante nuestro tiempo en 
el Area51. Tal vez recibiste una invitación al beta privado que te mando 
un conocido. Sea como sea, tu nivel de apoyo nos ha ayudado a formar una 
fuerza que inculco la necesidad de abrir el sitio al público. Ahora todo 
nuestro trabajo empezara a dar fruto.


Nos gustaría agradecer a todos los que ayudaron con su tiempo, energía, 
y dedicación a este sitio porque sin esos esfuerzos, no disfrutaríamos 
de este logro. Están construyendo un lugar en donde podrán compartir sus 
intereses, mejorar sus habilidades, y divertirse - mientras que 
contribuyen a un recurso ideal de alta calidad para nosotros, los 
desolladores de habla hispana.


*¡Avisen a sus amigos y a sus colegas sobre nuestro sitio!* El triunfo 
que buscamos depende en que nosotros (los primeros en popular este 
sitio) corramos la voz, publiquemos buenas preguntas, y ayudemos a 
solucionar los problemas que se presenten en nuestra comunidad. 
Manteniéndonos enfocados, Stack Overflow en Español 
 crecerá a ser un sitio inolvidable.


Disfruten de su comunidad,

El equipo de Stack Overflow

Questions? Comments? Let us know on our feedback site 
. If you no longer want to receive mail 
from Stack Exchange Area 51, unsubscribe from all Area 51 emails 
 
with a single click.


Stack Exchange, Inc. 110 William St, 28th Floor, NY NY 10038 <3



___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/