« first day (31 days earlier)    last day (15 days later) » 

21:45
@Christian pana me puedes resolver una duda de python please
22:02
@AgileSoul yes
@PingüiMaya ok
22:16
@Christian lo que pasa es que existen unos metodos raros que empiezan por doble guion pero algunos se pueden usar sin el doble guion escribiandolos de manera distinta, pero no siempre es el caso por ejemplo:
cadena="si"
print(dir(cadena))
print(len(cadena))
print(cadena.__len__())
el metodo len(cadena) es lo mismo que cadena.__len__()
@AgileSoul el único método que hay ahí es __len__()
len() es una función nativa de python
osea que son distintos ?
hacen lo mismo pero son distintos?
mayormente los métodos con 2 guiones bajos son los dunder methods
o métodos mágicos
y son redefinibles
@AgileSoul la función len() llama al dunder method __len__()
al igual que print() llama a __repr__()
dices que estos metodos se pueden modificar ?
Yes i do
Mira
class Test:
    def __init__(self):
        self.var = "holas"
    def __len__(self):
        return 0
Se crea una clase Test y se redefine el método __len__()
donde simplemente retornamos 0
Primerro creamos una insancia t = Test()
Y si ahora hacemos un print(len(t))
obtendremos 0
Ya que hemos modificado el método máigco __len__() para que siempre devuelva 0
22:29
entiendo creo
pero todo lo que es un metodo magico puede ser invocado con alguna otra funcion ?
@AgileSoul eso depende
si la función la creas tu pues... puedes invocar lo que quieras
pero si es una función nativa de python o de alguna librería entonces debes de buscar como funciona
por ejemplo __sizeof__() no se puede llamar como sizeof()
es lo que dices tengo que crear sizeof() como una referencia a __sizeof__() o si es una funcion nativa pues no hace falta crearla
es asi o no ?
espera te pongo un ejemplo
class Test:
    def __init__(self):
        self.var = "holas"
    def __len__(self):
        return 0
    def __repr__(self):
        return f"hola, este es un método de prueba y teng la variable {self.var}"
Ahora redefinimos el méodo __repr__
como haces pa escribir codigo entre mensajes?
y creamos una función parecida a prrint
@AgileSoul pegas el código aqui y si ocupa varias línease sale un boton llamado fixed fon
def my_print(obj):
    return obj.__repr__()
Lastimosamente vamos a seguir usando print ya que la función que he creado no es capaz de escribir en la consola
t = Test()
print(my_print(t))
y nos dará como resultado hola, este es un método de prueba y teng la variable holas
@AgileSoul Como vez puedes crear una función que llame a métodos mágicos
22:40
Si entiendo
pero tambien podrias hacerlo sin crearla como print(t.__repr__())
Tambien puedes crear tus "propios" métodos mágicos
class Test:
    def __init__(self):
        self.var = "holas"
    def __len__(self):
        return 0
    def __repr__(self):
        return f"hola, este es un método de prueba y teng la variable {self.var}"
    def __method__(self):
        return "my mehod"

def my_print(obj):
    return obj.__method__()

t = Test()
print(my_print(t))
@AgileSoul sip
pero internamente print() ya llama a __repr__()
entonces solo hace falta print(t)
?
pero a ti el codigo entre oraciones te sale mejor escrito el mio sale como palabras normales
@AgileSoul entre oraciones usa los backticks `
@AgileSoul yes
como hago para mostrar algo en la terminal (bash)??
print(t) daria hola, este es un método de prueba y teng la variable holas
es asi ?
que quieres mostrar ?
@AgileSoul sip ya que se ha redefinido el dunder method __repr__() si lo quitas al hacer print(t) se te mostrará algo como <__main__.Test object at x090912232>
@AgileSoul ya vi que se hace con echo :)
ahoras sip
class Test:
    def __init__(self):
        self.var = "holas"
    def __len__(self):
        return 0
    def __repr__(self):
        return f"hola, este es un método de prueba y teng la variable {self.var}"
    def __method__(self):
        return "my mehod"

def my_print(obj):
    os.system(f"echo {obj.__method__()}")

t = Test()
my_print(t)
22:49
ah si y tambien tienes a printf
si ejecutas eso en tu maquina se mosrará el mensaje
sin necesidad de usar print
falto importar el os
ahora si lo pruebo
justo esta escribiendo eso
mi teclado está un poco mal y tardo en escribir
tranquilo pana
lo copie y me imprimio "mi mehod"
22:54
 import os
  9 class Test:
 10     def __init__(self):
 11         self.var = "holas"
 12     def __len__(self):
 13         return 0
 14     def __repr__(self):
 15         return f"hola, este es un método de prueba y teng la variable {self.var}"
 16     def __method__(self):
 17         return "my method"
 18
 19 def my_print(obj):
 20     os.system(f"echo {obj.__method__()}")
 21
 22 t = Test()
 23 my_print(t)
@AgileSoul por que la función my_print() llama al dunder method __method__
aaaaaaaaa
puedes cambiarlo y hacer que llame a __repr__() si quieres
ya lo hize y funciono dejando solo a obj
creo que debe ser por que se está convirtiendo a un string
22:57
otra cosa rara es que dir(cadena) me imprime una lista diferente a cadena.__dir__()
al usar f-string o hacer una concatenación se hace una conversión implícita a str
pero pensé que en ese caso se usaba el dunder method __str__
@AgileSoul seguamente la función dir() modifica el resultado de __dir__
@Christian asi debe ser
@AgileSoul aqui puedes hacer os.system(f"echo el reultado es: {obj.__repr__()}") y el resulltado de my_print() es diferente a __repr__() ;)
en todo caso gracias, ahi aprendi como es que funcionan esos metodos
De nada, es bastante divertido explicar estas cosas
23:01
@Christian voy a probar
la librería pandas redefine varios dunder methods para poder hacer sus operaciones
por ejemplo para comparar 2 dataframes se redefine el dunder mehhdos __and__
(df1 & df2)
creo que también lo hacía para __getitem__
el reultado es: hola, este es un método de prueba y teng la variable holas
imprime una parte con echo, y luego imprime lo que returna el __repr__()
@AgileSoul pues sip y eso es distinto a __repr__(). Con eso quiero que veas que muhas cosas pueden ser cambiadas e implementadas
@AgileSoul exacto, eso es lo que hace nuestra función my_print
Por ejemplo la librería pprint se ayuda de eso para mostrarte los diccionarios y listas de forma "bonita"
es decir con indentación y no en una sola línea como lo hace print
ahora me acorde que en javascript se redefinen metodos asi de forma similar como el del metodo map
@Christian interesante
@AgileSoul no sabía eso. He conozco muy poco (casi nada) de JS en profundidad
23:13
estoy leyendo un libro de hacking etico con herramientas python, y pues en la introduccion al lenguaje dice que una tupla es inmutable y por tanto no se puede modificar ninguno de sus valores ni se pueden añadir mas, pero me queda la duda de, ¿se pueden borrar valores de una tupla?
@AgileSoul pues nop. Las tuplas no soportan (o implementan) los dunder methods __setitem__ y __delitem__
lo que las hace inmutables
oh ya
__setitem__() agrega un elemento mediante la notación de corchetes y __delitem__() se invoca cuando se hace del tupla[i]
puedes crear una clase My_tuple que herede de tuple y redefinir algunos de sus métodos
@Christian pero ya no seria una tupla
@AgileSoul pues nop, ni en tipo ni en características
type((1,2)) dará tuple pero si creas una tupla con tu clase tup = My_tuple((2,3)) y haces type(tup) dará My_tuple
23:22
eso de __setitem__ y __delitem__ es como append , insert() o del
@AgileSoul pues sip, esos son métodos que internamente llaman a los dunder methods
@Christian asi es como funciona la POO
@AgileSoul yess...
y esos metodos son del lenguaje como len ?
me refiero a append
@AgileSoul es mucho más bonio llamar a .append("x") que hacer a = a.__add__("x")
@AgileSoul nop, esos son métodos creados para cada tipo de dato
la notación variable.algo() significa que algo es una función del objeto variable
23:26
aaaa si
y algo(calquiera) significa que existe una función lllamada algo
bien explicado
1 min ago, by Christian
la notación variable.algo() significa que algo es una función del objeto variable
allí la función algo le pertenece al objeto variable
lo habia olvidado
lo aprendi con js
algo raro es que lo que es un diccionario en python, en js es un objeto
bueno tengo que salir, así que hasta luego
@AgileSoul ajaja pues sip
23:29
@Christian hasta pronto, gracias ahi.
de nada :D

« first day (31 days earlier)    last day (15 days later) »