Bienvenido a la Comunidad de Treehouse
¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.
¿Buscas aprender algo nuevo?
Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de
Inicia tu prueba gratuita
Andy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosUsando variable como atributo
Comencé a escribir el siguiente código:
def editar():
aeditar = str(input('Qué libro deseas editar'))
parte = input('¿Qué deseas cambiar al respecto? \nEscribe número para seleccionar lo siguiente: \n1. Título \n2. Autor\n3. Fecha de publicación\n4. Precio\n')
if parte == '1':
cambia = input('¿De acuerdo, a qué deseas cambiar el título?')
bookie = models.sesión.query(models.Libro).filter_by(title=aeditar)
para bkie en bookie:
bkie.title = cambia
print(bkie)
Y repetí este bloque para cada atributo del objeto. Luego me di cuenta de que podría hacerlo más conciso escribiendo solo la parte inferior del bloque una vez e insertando algunas variables así:
elif parte == '3':
parte = 'pubdate'
cambia = input(f'¿De acuerdo, a quién debo cambiar {part}?')
bookie = models.sesión.query(models.Libro).filter_by(parte=aeditar)
para bkie en bookie:
bkie.parte = cambia
Esto no funciona porque una variable no puede pasarse como atributo. ¿O puede? ¿Hay alguna forma de hacer que esto funcione?
1 Respuesta
Chris Freeman
68,469 puntosHola Andy McDonald, ¡excelente pregunta!
Utilizando notación de asterisco, un dict puede usarse como pares de palabras clave. Si se usa part como variable, el diccionario puede definirse y expandirse como kwargs.
# definir
kwdict = {parte: aeditar}
# usar como
bookie = models.sesión.query(models.Libro).filter_by(**kwdict)
# luego
para bkie en bookie:
setattr(bkie, parte, cambia)
Publica de nuevo si necesitas más ayuda. ¡Buena suerte!
Andy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosAndy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosA menos que me esté perdiendo algo. No creo que esta sea una sintaxis válida. Necesito pasar esto como (atributo = 'valor'}. Pasar un par clave-valor sería más como ('clave' : 'par')
Chris Freeman
68,469 puntosChris Freeman
68,469 puntosHe creado el siguiente código. Guarda en un archivo local y ejecuta usando
python <filename>. Puede ayudarte a entender cómo usar la "notación de asterisco" para desempacar un diccionario en atributos.salidas:
Andy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosAndy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosAcabo de darme cuenta de cómo usar esto y esta próxima pregunta es totalmente hipotética: Digamos que hay mucha notación de punto apilada en un objeto. ¿Cómo usarías setattr para hacer eso con el último atributo? ¿Es simplemente que cada atributo tiene su propio argumento posicional y el último argumento es aquello a lo que se establece?
Chris Freeman
68,469 puntosChris Freeman
68,469 puntosRespecto a
setattrusar, aquí hay algunos otros ejemplos:Resultados:
Juega con esto. Publica si necesitas más ayuda. ¡Buena suerte!
Andy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosAndy McDonald
Desarrollo en Python Graduado de Techdegree 13,801 puntosTe volveré a contactar en 4 semanas sobre ese