Sto cercando un modo più elegante di dichiarare un valore variabile in cui la funzione potrebbe restituire None
e ci sono metodi concatenati che seguono la chiamata di funzione.Python: modo sicuro ed elegante per impostare una variabile dalla funzione che può restituire Nessuno
Nell'esempio che segue sto usando BeautifulSoup per passare un documento HTML e se l'elemento che sto cercando non viene trovato, la chiamata della funzione iniziale restituisce None
. I metodi concatenati quindi interrompono il codice perché .string
non è un metodo dell'oggetto None
.
Quale tutto ha senso, ma mi chiedo se c'è un modo più pulito per scrivere queste dichiarazioni variabili che non si interromperanno su un valore None
.
# I want to do something like this but it throws error if soup.find returns
# none because .string is not a method of None.
title = soup.find("h1", "article-title").string or "none"
# This works but is both ugly and inefficient
title = "none" if soup.find("h1", "article-title") is None else soup.find("h1", "article-title").string
# So instead I'm using this which feels clunky as well
title = soup.find("h1", "article-title")
title = "none" if title is None else title.string
Un modo migliore?
Penso che in questo caso, il 'try ... ad eccezione di AttributeError' wrap è il metodo predefinito (o più semplice) per risolverlo, in particolare per un lungo set di metodi concatenati. – Evert
È chiaramente alla ricerca di [operatore di navigazione sicuro] (http://docs.groovy-lang.org/latest/html/documentation/index.html#_safe_navigation_operator) come viene chiamato in Groovy. Non esiste un tale costrutto in Python. Ma sono d'accordo che potrebbe essere utile, specialmente quando hai una lunga catena di metodi che chiamano potenzialmente restituire Nessuno. @Esegui l'unico problema con la soluzione 'try ... except AttributeError ... 'non puoi distinguere tra un'eccezione generata da uno dei metodi concatenati che restituisce' None' e un'eccezione "reale" generata da un metodo chiamato (cioè : "nasconderà" AttributeError') –