es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprueba si existen submétodos en una línea (en Python).

Estoy desarrollando un bot de Telegram en Python (3.7).
Estoy recibiendo actualizaciones/mensajes POST de los usuarios (clase telegram.update.Update).

if request.method == "POST": 
    update = Update.de_json(request.get_json(force=True), bot)

Luego estoy almacenando todos los parámetros del “mensaje” entrante en variables.
Por ejemplo, si hay una actualización del estado del usuario, lo guardo de esta manera:

if update and update.my_chat_member and update.my_chat_member.new_chat_member \
                and update.my_chat_member.new_chat_member.status:
    new_status = update.my_chat_member.new_chat_member.status
else:
    new_status = None

Es importante para mí guardar ‘None’ si este parámetro no se proporciona.

Y necesito guardar alrededor de 20 parámetros de este “mensaje”. Repetir esta construcción 20 veces para cada parámetro parece ser ineficiente.

Intenté crear una función de verificación para reutilizarla y verificar si los parámetros existen en una línea para cada parámetro:

def check(f_input):
    try:
        f_output = f_input
    except: # entiendo que es una excepción muy general, pero según lo que aprendí, está bien para estos casos
        f_output = None
    return f_output

new_status = check(update.my_chat_member.new_chat_member.status)

Pero, si cierta actualización no tiene update.my_chat_member, el error aparece en la etapa de llamar a la función ‘check’ ya que el objeto ‘NoneType’ no tiene el atributo ‘new_chat_member’.

new_status = check(update.my_chat_member.new_chat_member.status)
>>> AttributeError: 'NoneType' object has no attribute 'new_chat_member'

¿Podría alguien guiarme por favor, si hay una manera inteligente de guardar estos 20 parámetros (o guardar None), cuando el conjunto de estos parámetros cambia de mensaje a mensaje?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para guardar eficientemente estos 20 parámetros sin tener que repetir la misma construcción para cada parámetro, puedes usar la función getattr() en Python. Esta función recupera un atributo de un objeto basado en el nombre proporcionado, y devuelve None si el atributo no existe.

    Aquí tienes un ejemplo de cómo puedes usar getattr() para guardar el parámetro update.my_chat_member.new_chat_member.status:

    new_status = getattr(getattr(getattr(update, 'my_chat_member', None), 'new_chat_member', None), 'status', None)
    

    Esta línea de código verifica si cada nivel del atributo existe antes de obtener el valor, y devuelve None si alguno de ellos falta.

    Puedes usar este enfoque para cada uno de los 20 parámetros que desees guardar, y ajustar los nombres de los atributos según sea necesario. De esta manera, no obtendrás un error si la actualización no tiene cierto atributo, y guardarás todos los parámetros en una sola línea de código.

Comments are closed.