J'ai un tas de déclarations que je veux utiliser, sauf sur. Oui mauvaise pratique.

Il doit y avoir une manière plus pythonique d'écrire ce qui suit?

try:
    E1=clean_html.find("span",{"class":"range-a"}).text
except AttributeError:
    E1=None

try:
    E2=clean_html.find("span",{"class":"range-b"}).text 
except AttributeError:
    E2=None

try:
    E3=clean_html.find("span",{"class":"range-c"}).text 
except AttributeError:
    E3=None

try:
    E4=clean_html.find("div",{"class":"Description"}).get_text(separator=" ").strip()
except AttributeError:
    E4=None

Parce que ce code fonctionne bien pour moi, mais il semble inefficace.

0
Rivered 15 janv. 2021 à 00:54

2 réponses

Meilleure réponse

Vous pouvez écrire une fonction qui gère l'essai et l'exception. Vous pouvez passer le post_processing en tant que lambda si vous voulez que la fonction gère le problème de None lançant des erreurs lors de l'appel de méthodes dessus

def get_clean_text(tag, class_name, post_processor):
    try:
        return post_processor(clean_html.find(tag,{"class": class_name}))
    except AttributeError:
        return None

E1 = get_clean_text("span", "range-a", lambda o: o.text)
E4 = get_clean_text("div", "Description", lambda o: o.get_text(separator=" ").strip())
1
Jolbas 14 janv. 2021 à 23:24

Vous pouvez attribuer une valeur par défaut aux variables, puis effectuer le travail. Puisque vous voulez que la valeur par défaut soit l'immuable None, vous pouvez

E1 = E2 = E3 = E4 = None

try:
    E1=clean_html.find("span",{"class":"range-a"}).text
    E2=clean_html.find("span",{"class":"range-b"}).text 
    E3=clean_html.find("span",{"class":"range-c"}).text 
    E4=clean_html.find("div",{"class":"Description"}).get_text(separator=" ").strip()
except AttributeError:
    pass

La meilleure façon de gérer les exceptions dépend de plus de contexte que ce que nous avons ici, mais généralement vous voulez écrire des blocs plus grands qui restent dans un état sain sur toute opération "exceptionnelle".

Étant donné que les exceptions nécessitent une certaine puissance de traitement pour la configuration et peuvent être visuellement désordonnées, les tests (en particulier lorsqu'ils sont enveloppés dans sa propre fonction) peuvent être une meilleure façon de procéder.

def get_elem_text(elem, default=None):
    if elem:
        return elem.text
    else:
        return default

E1=get_elem_text(clean_html.find("span",{"class":"range-a"}))
E2=get_elem_text(clean_html.find("span",{"class":"range-b"})) 
E3=get_elem_text(clean_html.find("span",{"class":"range-c"})) 
# I don't know what "get_text" is so can't abstract it
#E4=get_elem_text(clean_html.find("div",{"class":"Description"}), default="")).strip()
1
tdelaney 14 janv. 2021 à 22:22
65727441