Soy nuevo en Python y tengo una pregunta rápida.

¿Cómo puedo evitar repetirme cuando declaro las instancias de clase x1 x2 ..

Lo intenté con una lista, pero luego no pude crear un archivo para cada objeto. Y no todos los parámetros son iguales para mis objetos, d [0] está contando.

¿Alguna idea inteligente para deshacerme de repetirme aquí?

Gracias de antemano

class TestClass(object):
    def __init__(self, a, b, c: int):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return f" a= {self.a} b = {self.b} c = {self.c}"

def func1():
    a = input("a: ")
    b = input("b: ")
    return a, b

def func2():
    return 100, 90, 80, 70

c = func1()
d = func2()

x1 = TestClass(c[0], c[1], d[0])
x2 = TestClass(c[0], c[1], d[1])
x3 = TestClass(c[0], c[1], d[2])
x4 = TestClass(c[0], c[1], d[3])
h = {"a": x1,"b": x2, "c": x3, "d": x4}
for key, value in h.items():
    with open(f"Name {key}.txt","w") as f:
        f.write(str(value))


Salida:

#a: Anton
#b: Bernd
#
# four files Name a - d.txt were created
# file 1: a= Anton b = Bernd c = 100
# file 2: a= Anton b = Bernd c = 90
# file 3: a= Anton b = Bernd c = 80
# file 4: a= Anton b = Bernd c = 70
2
Maximilian 22 ene. 2021 a las 21:13

2 respuestas

La mejor respuesta

Debería iterar sobre el valor de retorno (tuple) de la función func2 (así en la variable d) con la función enumerate. La función de enumeración devuelve el valor y el índice relacionado del iterador (por ejemplo: https://realpython.com/ python-enumerate /). Luego puede agregar el elemento para su dict (vacío). Debes usar la función chr para definir las letras según el índice. La a minúscula es el 97.

Parte de código relacionada:

c = func1()
d = func2()
h = {}
for idx, value in enumerate(d):
    h[chr(97 + idx)] = TestClass(c[0], c[1], d[idx])

for key, value in h.items():
    with open(f"Name {key}.txt", "w") as f:
        f.write(str(value))

NOTA:

He escrito una versión de código más compacta. Puedes consultarlo si te interesa.

Código:

class TestClass(object):
    def __init__(self, a, b, c: int):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return f" a= {self.a} b = {self.b} c = {self.c}"


a, b, h, d = input("a: "), input("b: "), {}, [100, 90, 80, 70]
result = [(chr(97 + idx), TestClass(a, b, d[idx])) for idx, value in enumerate(d)]

for item in result:
    with open(f"Name {item[0]}.txt", "w") as f:
        f.write(str(item[1]))
2
milanbalazs 22 ene. 2021 a las 18:48

Respuesta rápida

  • Use una función, cuando necesite hacer algo que le llevará mucho tiempo de escritura o si necesita hacer algo repetidamente y luego empaquételo en una función.

    def create_func(fun_1, fun_2):
    
         result = {}
         acii_n = 97
         for item in fun_2:
             name = chr(acii_n)
             acii_n += 1
             class_instance = TestClass(fun_1[0], fun_1[1], item)
             result.setdefault(name, class_instance)
         return result
    
     h = create_func(c, d)
    
    
     for key, value in h.items():
         with open(f"Name {key}.txt","w") as f:
             f.write(str(value))
    
  • chr (i) Función. Puede ver que llamo a la función que comienza en int 97. Eso es porque el valor ASCII es la letra a -> asciitable.com.


Mejoras adicionales

Es curioso que la solución que di, que es usar una función, también es exactamente lo contrario de lo que puedo sugerirle que haga para mejorar su script, que es eliminar las funciones :).

class TestClass(object):
    def __init__(self, a, b, c: int):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return f" a= {self.a} b = {self.b} c = {self.c}"


def create_instances(fun_2):
    
    a = input("a: ")
    b = input("b: ")
    user_values = [a, b]
    result = {}
    ascii_n = 97
    for item in fun_2:
        name = chr(ascii_n)
        ascii_n += 1 # Step on the next charactes
        class_instance = TestClass(user_values[0], user_values[1], item)
        result.setdefault(name, class_instance)
    return result


int_values = [100, 90, 80, 70] # Just pack it into a list 
all_instances = create_instances(int_values)


for key, value in all_instances.items():
    with open(f"Name {key}.txt","w") as f:
        f.write(str(value))

Uso de la comprensión de un diccionario

Herramienta muy poderosa, rápida (puede ejecutar más rápido los bucles For) y super Pythonic :) Comprensión del diccionario Python.

class TestClass(object):
    def __init__(self, a, b, c: int):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return f" a= {self.a} b = {self.b} c = {self.c}"


int_values = [100, 90, 80, 70]
a = 'Python'
b = 'WOOW'
user_values = [a, b]
ascii_n = 97
result = {chr(ascii_n+idx): TestClass(user_values[0], user_values[1], item) for idx, item in enumerate(int_values)}

for key, value in result.items():
    with open(f"Name {key}.txt","w") as f:
        f.write(str(value))
1
Federico Baù 22 ene. 2021 a las 18:54
65850558