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.
2 réponses
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())
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()
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.