« first day (1432 days earlier)      last day (1690 days later) » 

5:01 PM
@abulafia no me han ayudado,
 
@JackNavaRow Solo lei la invocación. No lei la duda ¿llegaste a escribirla?
 
@abulafia si , pero la puedo reenviar
def func(a=[], b={}):
    print(a)
    print(b)
    print('#' * 12)
    a.append(len(a))  # this will affect a's default value
    b[len(a)] = len(a)  # and this will affect b's one

func()
func()
func(a=[1],b={2:2})
func()
¿porque mantiene el valor?
 
Mmm.. parece enrevesada.. no pondría la mano en el fuego sobre qué sale de ahi.. sospecho que la última llamada "sigue donde la segunda lo había dejado"?
 
si señor cuando hago func()
varias ocasiones ingresa el valor y mantiene el objeto en la variable al siguiente func
PabloLozano lo vio como una clausura
 
Si., efectivamente, acabo de comprobarlo. Bueno, eso es una mierda. Aunque puede explicarse, viola el principio de mínima sorpresa. No debería ocurrir
 
lo que pasa es que el objeto [] que le pasas como valor por defecto a a, se crea una sola vez, en tiempo de creación de la función, y no en tiempo de invocación
a priori, yo no diría que eso tenga nada qué ver con las clausuras
 
osea que esta llamando la funcion antes que se cree algo?
 
@abulafia lo supuse, pero igual como lo veas es un codigo aparentemente extraño
@abulafia es decir que lo que muestra es la referencia?
si no pasa por parametros mantiene la referencia y por ende se puede modificar los atributos iniciales?
 
@JackNavaRow Sí, ya dije que era una mierda
Por eso no debe hacerse así. No debes usar una lista vacía como valor por defecto para un parámetro, si luego vas a modificar algún elemento de la lista
El patrón de diseño (je) correcto sería
 
@abulafia el codigo casi equivalente para que se entienda es asi?
a = []
b  ={}
def func(a=a, b=b):
    print(a)
    print(b)
    print('#' * 12)
    a.append(len(a))  # this will affect a's default value
    b[len(a)] = len(a)  # and this will affect b's one

func()
func()
func(a=[1],b={2:2})
func()
 
5:13 PM
@JackNavaRow Exactamente
 
a = []
b  ={}
print("id de a", id(a))
def func(a=a, b=b):
    print(id(a))
    print(b)
    print('#' * 12)
    a.append(len(a))  # this will affect a's default value
    b[len(a)] = len(a)  # and this will affect b's one

func()
func()
func(a=[1],b={2:2})
func()
 
def func(a=None, b=None):
    if a is None: a = []
    if b is None: b= {}
    print(a)
    print(b)
    print('#' * 12)
    a.append(len(a))  # this will NOT affect a's default value
    b[len(a)] = len(a)  # and this will NOT affect b's one
Y esta sería la forma correcta ^^^
 
tengo una curiosidad
esas variables su alcance es de funcion?
en el ejemplo que hice obviamente es mala practica
y no funciona asi
y otra duda tambien, entonces hay que evitar asignar valores que no sean primitivos
 
@JackNavaRow Mejor, que no sean inmutables
(como valores por defecto de parámetros, entiendo que quieres decir)
@JackNavaRow ¿Qué variables?
 
@abulafia le coloque un * pero creo que lo borre
a y b,
 
5:26 PM
@JackNavaRow Si, la lista de argumentos formales son en el fondo variables locales de la función, a las que se asigna un valor en la invocación
@JackNavaRow El asterisco no tiene qué ver con la inmutabilidad. No te vayas a confundir con punteros del C o algo. ¿Dónde pusiste el *?
 
en primitivos*
 
@JackNavaRow Ah XD
 
el * es args, y e ** es el kwargs
eso lo aprendi ayer
 
@JackNavaRow Es más cosas. También es el splat (equivalente al ... de javascript, el cual aprendí también ayer)
 
igual el operador * es algo que tiene multiples funcionalidades
 
5:29 PM
a =  [1, 2, 3]
funcion(*a)
# Es lo mismo que
funcion(1,2,3)
 
estoy aprendiendo un poco mas a fondo python
 
Y también para "recoger lo que sobra" en desempaquetado de tuplas
a, b, *c = (1,2,3,4,5,6)
a=1, b=2 , c=(3,4,5,6)
 
pero me paso algo dije voy por funciones, dije esto es facil y plam un golpe por la boca
python es muy versatil en el manejo de variables
en pasar un valor de uno a otro
 
es muy dinámico, el duck typing y eso
 
ya hasta entiendo el porque len separado del string y otras cosas
 
5:33 PM
ideal para hacer algo "quick & dirty", por eso gusta mucho a los físicos, matemáticos, etc. Pero por eso hay que tener cuidado también en proyectos grandes, que se beneficiarán de las anotaciones de tipos y el testing
 
goalkicker.com aquí también hay varios libros gratis
 
@JackNavaRow Bueeno! Y ¿has descubierto ya los dunder methods?
los que empiezan y terminan por __
 
@abulafia apenas voy por declarar funciones
@abulafia he leido sobre eso y hace algun tiempo lo explicastes
supongo que cuando expliquen POO lo diran
 
Puedes implementar tus propias clases, y si les implementas ciertas "funciones mágicas" se comportan como tipos nativos
 
igual tu me explicastes porque usar__ __main____
 
5:34 PM
Puedes hacer que tus objetos respondan a len()si les implementas el método __len__()
 
el toString tambien
 
O que se puedan convertir en cadenas con str(objeto) si implementas .__str__()
 
lo he implementado pero ha sido por casualidad
 
o mil cosas más. Que se puedan comparar entre sí si implementas el __eq__(), que se puedan sumar si implementas el __add__(), etc
 
@abulafia pero requiere un extend de Object?
aunque creo que todos los lenguajes siempre heredan de Object
no hay que hacerlo implicito
 
5:40 PM
En python3, todas las clases heredan de object sin que tengas que ponerlo
 
@abulafia y el 2 no es igual?
 
En python2 había que ponerlo para distinguir qué "tipo de clases" ibas a usar. Una chapuza que tenía python2, que implementaba dos "tipos de clases", una que llamaba "old style" y otra "new style". La que molaba era la "new" y la otra solo estaba por compatibilidad hacia atrás
si ponías class MiClase:, era "old style" (y así era compatible con el código preexistente)
si querías usar las "new style" había que poner class MiClase(object):
como digo, una chapuza. Menos mal que Python3 terminó con todo eso. Todas son "new style"
así que en Python3, class MiClase: y class MiClase(object): son lo mismo
 
asombroso, las diferencias que solo te das cuenta cuando nadas en aguas mas abiertas
 
hace muy poco empece a ver POO en python, sigo viendo.. pero aun no vi los famosos "getter" y "setter"
 
@LucasDamian hace algun tiempo lei una respuesta de abulafia o FJSevilla explicando eso, decian algo como tus variables tu responsabilidad
fue una asombrosa respuesta
@abulafia tu recuerdas escribir alguna respuesta sobre los getter y setter
 
5:51 PM
@LucasDamian No son tan habituales como en Java, porque python no tiene nada privado
pero aún así puedes hacerlas con el decorador @property
Oh los decoradores! Otra maravilla!
 
@abulafia y son nativos
 
@JackNavaRow Uf.. mi memoria cada vez es peor. Respondo de todo y luego lo olvido. Y cuando hay preguntas antiguas de esas que SOes "vuelve a portada", a veces estoy a punto de responderlas, pero descubro que ya tienen una respuesta mia :-)
Ahora bie, de getters y setters en particular, creo estar bastante seguro de que nunca escribí nada. Sería FJSevilla
@JackNavaRow Sí
 
5
A: ¿Como crear un List de setters y getters en python?

Patricio MorachoPrimero que nada, no hay getters o setters al estilo Java en Python. No hay forma, no existen. Se puede hacer algo parecido, si, sin duda, pero lo que hagamos no va a tener nunca la filosofía de Java. Hay un concepto que describe bien la diferencias en este sentido entre ambos lenguajes, lo puede...

fue Moracho
"en Python esa idea se la reemplaza por un: "somos todos adultos", es decir cada uno sabe lo que está haciendo, si quieres modificar un atributo interno de un objeto, perfecto, se supone que sabes lo que estás haciendo."
 
Sí, acababa yo de dar con ella ahora
 
@abulafia, python dice :tus variables, tu decisión
 
6:00 PM
En python la protección se basa en el respeto :-) Si pongo un cartel "No pasar", es suficiente. No tengo que poner además una verja electrificada
 
@JackNavaRow otro Maestro
 
el cartel de "No pasar" es el comenzar por _ el nombre del atributo. Un atributo llamado _peso, por ejemplo, está diciendo "Este lo usa esta clase internamente, por favor no modificar desde fuera"
 
"somos todos adultos". Que genio jaja
 
Pero si quieres cambiarlo, se deja. Lo que viene bien en casos de emergencia. A veces, en caso de vida o muerte puede ser necesario saltarse el cartel de "No pasar". Con la verja electrificada sólo te quedaría morir.
 
@LucasDamian master
 
6:04 PM
a que llaman "decoradores" ?
@PedroMiguelPimientaMorales Como esta PM^2
 
hola buenas
alguien controla los eventos de mysql?
 
@LucasDamian :O quieres un debate!
@property es un decorador
 
@app.route
 
si señor!
en otra palabras decora para poder usar
 
@lru_cache
 
6:12 PM
imagina que llega una visita y tu mama dice espera que limpie para que pasen
 
@abulafia también es un decorador , tiene 'arroba'
 
aplica el concepto, decora la funcion para que la entendamos
 
Nice
 
@LucasDamian bien y usted
 
6:30 PM
bien bien, trabajando y estudiando
 
@LucasDamian que bien
@LucasDamian plotify.fun
 
mm, no tengo sonido en la pc
 
guardela
no es para el trabajo
oiga ustd trabaja en donde, en una cueva
 
wardea3
 
comprese unos audifonos
 
6:34 PM
tengo audifonos, pero los conecto al celular
 
asi sea para en los momentos de quietud este bien
mal
 
@LucasDamian Un decorador es otra de esas ideas geniales. Conceptualmente simple, pero tan potente que te explota la cabeza cuando empiezas a ver todas sus posibles aplicaciones
El concepto es este: un decorador no es más que una función, que recibe como parámetro otra función y devuelve como resultado una tercera función. Todo muy "meta"
Y la sintaxis @ es azucar sintáctico
@decorador
def foo():
   print("Bu!")
equivale básicamente a
def foo():
   print("Bu!")

foo = decorador(foo)
Es decir, sustituye la función foo por la función retornada por el decorador, cuando le pasas foo como parámetro
Eso es todo! Pero ahora empieza a pensar qué podrías hacer con ello...
 
@abulafia qu lenguaje trabajas?
 
@PedroMiguelPimientaMorales Python
 
@abulafia haaa ok
 
6:39 PM
foo =decorador(foo)
es similar a
foo = lambda x:print(x) ?
 
@LucasDamian Solo en que la variable foo que tienes al final se puede ejecutar. O sea, que puedes hacer foo()
pero en el primer caso lo que ejecutarías es la función retornada por el decorador, y en el segundo ejecutarías la lambda
 
@abulafia como asi, ejecutas la variable 'foo' que tiene el valor retornado?
 
@PedroMiguelPimientaMorales Sí, pero el valor retornado es una función
 
@abulafia haaa ok, y como hace uno entonces para cceder a dicho valores qu pueda genera la funcion?
 
por ejemplo, un decorador (un tanto inutil) que cambia una función por otra que dice "no me uses" se implementará así:
def deprecated(func):
    def no_me_uses():
       print("Esta función está obsoleta. No la uses")
    return no_me_uses
Así que puedes ahora hacer
@deprecated
def mi_funcion_vieja(parametros):
    print("Aqui hacia cosas obsoletas")
Y así, cuando alguien llame mi_funcion_vieja(23), por ejemplo, por pantalla saldrá "Esta función está obsoleta. No la uses"
El decorador en este caso ha cambiado una función por otra
pero puede no ser tan agresivo, puede ejecutar la función original además de emitir el warning
 
6:45 PM
@abulafia ok, osea que el decorador es @deprecated ?
 
def deprecated(func):
   def avisar_deprecated(parametros):
       print("Esta función está obsoleta. Mejor no la usabas. Estás avisado")
       func(parametros)
   return avisar_deprecated
@PedroMiguelPimientaMorales Sí, el decorador es @deprecated, pero su implementación es la función deprecated. Y se espera que esa función reciba como parámetro otra función, y retorne otra función
 
@abulafia por ley debe si o si recibir una funcion y retornar otra, o podria retornar la misma?
 
@PedroMiguelPimientaMorales Podría retornar la misma, pero entonces no tendría utilidad
lo que suele retornar es otra función que dentro llama a la original
y aprovecha para hacer otras cosas
Otro ejemplo de decorador, útil para trazar
def trazador(func):
    def trazar_ejecucion(param):
        print("Iniciando ejecución de", func.name)
        r = func(param)
        print("Terminando ejecución de", func.name)
        return r
   return trazar_ejecucion
 
@abulafia podrias poner un ejemplo mas complejo con numeros calculos operaciones, para poder comprender el por que poca utilidad y demas cosas
 
Así ahora puedes hacer
@trazador
def raiz_cuadrada(n):
    return n**0.5
y cuando hagas resultado = raiz_cuadrada(25), seguirás recibiendo la respuesta 5, pero también verás mensajes de "Iniciando ejecución" y "Terminando ejecución"
Había un error en la implementación del decorador, esta es la versión correcta
def trazador(func):
    def trazar_ejecucion(param):
        print("Iniciando ejecución de", func.__name__, "con parámetro", param)
        r = func(param)
        print("Terminando ejecución de", func.__name__)
        return r
    return trazar_ejecucion
>>> raiz_cuadrada(25)
Iniciando ejecución de raiz_cuadrada con parámetro 25
Terminando ejecución de raiz_cuadrada
5.0
Otro ejemplo de utilidad "registrar" funciones. Por ejemplo, ir guardando en una lista las que estén decoradas
 
7:01 PM
Buenas..
Alguna recomendación sobre esta consulta mysql quisiera saber si se puede mejorar:
(
	SELECT hi.central,count(hi.central) total
	FROM hyb_inde_gwc hi
    WHERE hi.fecha = CURDATE()
)
UNION
(
	SELECT hl.central,count(hl.central) total
	FROM hyb_laci_gwc hl
	WHERE hl.fecha = CURDATE()
)
UNION
(
	SELECT hl.central,count(hl.central) total
	FROM hyb_lflo_gwc hl
	WHERE hl.fecha = CURDATE()
)
UNION
(
	SELECT hm.central,count(hm.central) total
	FROM hyb_maip_gwc hm
	WHERE hm.fecha = CURDATE()
)
UNION
(
	SELECT ss_inde.central,count(ss_inde.central) total
	FROM ss_inde_gwc ss_inde
	WHERE ss_inde.fecha = CURDATE()
 
favoritas = []
def favorita(func):
    favoritas.append(func)
    return func

@favorita
def foo():
     return 0

@favorita
def bar():
    return 1
>>> foo()
0

>>> favoritas
[<function foo at 0x10350e6a8>, <function bar at 0x10350e730>]
 
@PedroMiguelPimientaMorales que falta de respeto, te habla parsel y aun asi preguntas
@abulafia pero en algunas ocasiones no te confundes con los decoradores?
digo, por el orden de ejecucion , como lo interpreta y esas cosas
yo conceptualmente lo entiendo , se cuando hay que aplicarlo, pero siempre tengo que leer para recordar
yo conceptualmente lo entiendo , se cuando hay que aplicarlo, pero siempre tengo que leer para recordar
 
7:27 PM
@JuanPerez Nada, más allá de decirte que los paréntesis son superfluos.
 
@JackNavaRow Me tengo que parar a pensarlo un poco, pero me ayuda la receta foo = decorador(foo)
 
Aprovecho el momento, para saludar al gran Patricio Moracho y hacerle una pregunta
 
la cosa queda más fea cuando el decorador ha de servir para funciones arbitrarias, con cualquier número de parámetros. Entonces es cuando aparecen los infames *args y **kwargs
 
@LucasDamian buenas
 
Tengo una base de datos donde los campos de una tabla son en su mayoria varchar, cuando hago los insert con sqlalchemy, hace una especie de "super-insert" (pd.to_sql) y lo que hace es.. truncar la tabla, y me transforma los varchar en 'Text' . la pregunta es, como puedo hacer una consulta simple "select * from tabla where campo='algo'
 
7:31 PM
@PatricioMoracho Ah vale.
 
@PatricioMoracho The data types text and varchar are incompatible in the equal to operator. Es el error que arroja
 
@LucasDamian imagino que estás hablando de SQL no? bien, los datos TEXT y VARCHAR no son compatibles para hacer una comparación, por ejemplo:
declare @T table (A TEXT, B VARCHAR(100))
insert into @T(A, B) values ('X', 'X')
select * from @T where A = B
Tal vez pueda servirte hacer: select * from @T where CONVERT(VARCHAR(255),A) = B
Sin embargo dependerá de los datos que estés guardando en la columna TEXT
 
okey, Si, estaba usando cast(name as VARCHAR) como comodin
hay una diferencia con convert?
 
@LucasDamian A que te refieres con una diferencia con convert? de performance? seguramente por que cada fila debe ser convertida a un varchar.
 
Me refería sí daba igual poner cast o convert
 
7:43 PM
@JackNavaRow todo un voldemort @abulafia Adaba Kadabra
 
@LucasDamian Interesante pregunta ¿Que diferencias hay entre un convert y un cast? hasta dónde sé, CAST es la forma más ANSI SQL y CONVERT es la forma más avanzada que aporta más funcionalidad, por ejemplo todas las opciones de formateo de fechas/horas. En tu ejemplo en particular vale cualquiera de las dos.
 
Eres de una especie de Semi Dios de sgbd @PatricioMoracho
 
8:05 PM
@LucasDamian creo que Chema fue uno de los pro en python en los primeros años
 
@LucasDamian Ya :-) Yo que había dado el algoritmo en el comentario, medio en pseudo-codigo para que se lo pensara un poco mas...
 
@abulafia el for else genial de python!
por cierto ese fue el mismo usuario que tuvistes el problema @abulafia?
 
@JackNavaRow Hum... no veo qué se gana con ese else: en este caso. Lo mismo daría poner el lista2.append(m) fuera del bucle, no?
@JackNavaRow ¿Qué problema? No creo, lo que pasó con éste es que borró la pregunta ayer, y luego hoy la volvió a poner idéntica.
 
8:22 PM
@abulafia esa misma
por cierto ese fue el mismo usuario que tuvistes el problema @abulafia?
 
8:43 PM
alguin sabe para que podria servir eso
 
8:55 PM
Buen día a todos
cómo va la cosa por acá?
 
@PedroMiguelPimientaMorales _ Ideal for small projects, prototypes or hackathons, where you don't have to spin up your own data store._
 
@abulafia mmm, ya veo, cosas rapidas o muy personales
@JheymanMejia hasta el momento cero muertos
 
Alguno de uds por casualidad ha trabajado con el CMS Grav?
Tengo varias dudas para implementarlo en un hosting con Windows
 
 
2 hours later…
10:39 PM
buenas tardes/noches hermanos
¿Cómo vamos?
@JheymanMejia negativo, aquí revisando el enlace que has compartido, se ve interesante, tengo la sensación que es primo de Jekyll
 

« first day (1432 days earlier)      last day (1690 days later) »