[Python] Hilo general

Rezagado

Esto debería generarme un archivo en el proyecto pero no lo hace, no entiendo porque...

def save():

website = web_entry.get()
email = email_entry.get()
password = password_entry.get()


with open("data.txt", "a") as data_file:
    data_file.write(f"{website} | {email} | {password}\n")
Rezagado

Nada ya está arreglado, que soy mongolo xd

2 respuestas
Taiden

#1742 un poco si

1 respuesta
Rezagado

#1743 lol que haces tú aquí

1 respuesta
Taiden

#1744 seguir el hilo porque a veces hay cosas interesantes

Lolerpopler

#1742 Grande eso de decir que ya esta arreglado pero no postear la solucion, no vaya a ser que alguien tenga el mismo problema en el futuro...

1 respuesta
Rezagado

#1746 Pues básicamente lo que se me había olvidado era llamar la función cuando clickas el botón

Tenía esto

def save():

website = web_entry.get()
email = email_entry.get()
password = password_entry.get()


with open("data.txt", "a") as data_file:
    data_file.write(f"{website} | {email} | {password}\n")

Y no se me generaba el archivo porque me faltaba añadir el command=save en el botón (todo este código es con Tkinter)

add_bt = Button(text="Save Password", width=44, bg="#C1C4DA", command=save)
2 1 respuesta
werty

#1747 como consejo, si estás haciendo una UI y va a ser medianamente compleja, te recomendaría hacerla mediante una clase (lo digo porque fue mi caso, y menos mal que lo hice así xd)

ejemplo:

import tkinter as tk
class App(tk.Tk):
   def __init__(self):
      super().__init__()
      etc
 
   def save(self):
       etc

if __name__ == "__main__":
    app = App()
    app.mainloop()
27 días después
werty

tengo una duda a ver si alguien la resuelve:

digamos tengo una clase derivada de otra clase, donde hato a, b, c y z (sin entrar en qué exactamente)
Class B(A):
def init:
a
b
c
z

Pero luego quiero crear otra clase C tal que:
Class C(A):
def init:
a
b
c
d
e
z

Como haría para hacer C una subclase de B? el escollo es que necesito sí o sí que z sea lo último en ejecutarse en ambos casos, si hubiera un método tipo lastinit, que se ejecutarse después de init sería justo lo que necesito, pero no creo que exista, o sí?

2 respuestas
Kaiserlau

#1749 Tirale un vistado a super.

1 respuesta
Slowbro

#1749 Odio la herencia con fuerza, pero en el baúl de mierda tengo esto, por si te inspira: http://python-history.blogspot.com/2010/06/method-resolution-order.html

1 respuesta
werty

#1751 no me inspira mucho la verdad, no me resuelve la duda 🤣

#1750 he omitido super, pero vamos, el problema es el mismo. Si hago C una subclase de B y llamo a super(), ya estoy haciendo init de la clase padre (B) y por tanto llamando la función z después de c y no después de e (es decir, llamo z antes de lo que quiero, que es al final)

1 respuesta
Lolerpopler

#1752 Con la informacion y si lo he entendido bien, lo mas facil seria pasar una lista e ir llamando a lo que hay en la lista en orden, pero, sin saber que es lo que quieres conseguir, por que necesitas una (o varias) clases con herencia, pues no estoy muy convencido de comprender a donde quieres llegar.

Otra idea sobre la que podrias leer es method overloading, donde puedes definir la misma funcion pero con diferentes inputs y en base a lo que le pasas el lenguaje sabe la que tiene que usar, pero nunca he usado estas en constructoras. En esos casos simplemente definiria los paremetros y les daria un valor por defecto, por ejemplo:

def init(a,b,c,z, d=None, e=None):
a
b
c
if d:
...
if e:
...
z
1 respuesta
werty

#1753 a b c d etc son funciones (por poner un ejemplo sencillo imagina que son prints (print("a"), print("b"), etc) . y z es la última función que deseo llamar en ambos casos. Los inputs de la función son otros, aunque sí que podría hacer algo tipo: if mode==complex: d, f

pero la cosa es saber si hay alguna manera más pythonica de hacerlo.

otra forma era definir una función intermedia. Que en clade B es simplemente pass, pero en clase C si le meto d y e.

gracias igualmente.

1 respuesta
Lolerpopler

#1754 estaba pensando que serían funciones, pero no me acabo de imaginar porque querrías iniciar una clase que ejecute las funciones.

Si es porque vas a construir la clase con los resultados de esas funciones lo ideal sería ejecutar las funciones y luego pasar los resultados (aquí podrías tener la herencia que describes de B y C), también sería más óptimo por el principio de dependency injection. Mucho más fácil testear luego.

Si no es como describo arriba, la otra posibilidad sería que esa clase vaya a usar las funciones pero, en ese caso, porque no definirlas como métodos en la clase en vez de inyectarlas?

Si no es ninguna de estas dos opciones no acabo de ver cuál es caso concreto 😕

1 respuesta
werty

#1755 básicamente es un widget de tkinter.

Cuando necesito enviar un mensaje de error la clase B me permite levantar la ventana de error con una delaracion. Los inputs son (level, mensaje)

Pero a veces necesito algo más, la misma ventana pero con una caja de texto (clase C), así que inicialmente tengo las dos clases que hacen herencia de la clase original de tkinter (tk.Text), pero es que comparten todo el código menos lo de la caja de texto.
El problema es que al final de la clase necesito sí o sí lanzar dos líneas (update_idletasks() y otra cosa), esto sería z en el ejemplo.

2 respuestas
Lolerpopler

#1756 pero, si comparten todo, por qué no usar valores por defecto vacíos para el caso simple y para los del mensaje los pasas?
Una sola clase que ejecuta todo

No conozco la librería, también puede ser que clases y herencia no sea el camino a seguir

Kaiserlau

#1756 pastea el código a ver :smile: Yo tambien he picado tk dándole patadas xd. super tiene mucha miga.

werty

justo llego con esta solución (metaclass)

spoiler
1 1 respuesta
Rezagado

Menuda tilteada llevo con esto


price = soup.find(class_="a-offscreen").getText()
price_without_currency = price.split("€")[0]
price = float(price_without_currency) 
print(price)

ValueError: could not convert string to float: '819,00'

Porque no le da la gana convertirse a float?

1 respuesta
Slowbro

#1760 No será por la coma?

price = float(price_without_currency.replace(',' , '.' )) 

#1759 Joder, no sabia ni que eso existía :fearful:

1 respuesta
Rezagado

#1761 He probado de todo xD

Lo que estoy intentando es quitar el símbolo del euro para convertir la string a un numero y poder compararlo con otro. Lo de la coma pues no se, el número sale de web scraping (un precio de amazon) osea que viene con la coma ya, no se la puedo quitar

1 respuesta
Slowbro

#1762 Pero te sigue cascando con la coma?

Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
price = "819,00 €"
price_without_currency = price.split("€")[0]
price = float(price_without_currency.replace(',' , '.' ))
print(price)
819.0

1 respuesta
Rezagado

#1763 Vale eso si que funciona, no tengo ni puta idea de porque la verdad pero gracias

1 respuesta
telemaco103

,#1764 porque 819,00 no es capaz de interpretarlo como número, cosa que 819.00 si. Al hacer float(819,00) es cuando te está dando el error, cosa que al reemplazar la , por el . no pasa.

2
Slowbro

#1764 El tema es reemplazar la ´,´ con un ´.´ ya que es el separador que se usa en el mundo guiri para representar decimales.

"819,00 €" -> "819,00" -> "819.00" -> 819.00

La otra es usar los ´locale´ para que entienda que en Castilla se usa la coma

1
26 días después
Wei-Yu

me lo he encontrado por reddit y me ha hecho gracia, qué pensáis que ocurre aquí si se ejecuta usando cpython?

x = 0
y = 0

while x is y:
    x += 1
    y += 1

print(x)
what you might expect
what it does
why

comentario original con más info: https://reddit.com/r/programming/comments/11lw86u/comment/jbexxdo

3 1 respuesta
werty

#1767 curioso desde luego. Yo habría dicho que directamente cuando x=0, y=0, x is y sería falso, porque deberían referenciar dos direcciones de memoria distinta. Haciendo id(x), id(y) vemos que tienen la misma.
No me sorprende que no le haya pasado a nadie, quien usaría is para comparar ints? lol

2 respuestas
gonya707

#1768 No me extrañaria que fuese algo que le haya pasado a alguien completamente nuevo a programar que no conozca los operadores ==, != etc. pero haya visto cosas como not, in u otras cosas de python que se hacen en "lenguaje natural". Por inercia alguien podria pensar que is se puede usar como == y arreando

1
telemaco103

#1768 Cuidado que creo recordar que Python tenía una gestión de la memoria algo optimizada y que si dos variables compartían valor a veces apuntaban a la misma dirección de memoria o algo así.

De hecho creo que alguna vez para probarlo hice:

a=5
b=5
print(a is b)

Y esto daba True.

1 respuesta

Usuarios habituales