Linee guida per la restituzione di None vs. raise Errore per le funzioni di convalida della stringa Python

3

Diciamo che abbiamo una funzione che controlla se un certo schema si verifica in una stringa. Il comportamento predefinito è che se il modello corrisponde, restituisce il modello. Fin qui tutto bene, ma qual è il modo consigliato per gestire il caso in cui il modello non corrisponde. Ci sono molte alternative ovviamente ma posso elencarle due:

  • Restituisci None e poi gestisci None dall'ambiente chiamante
  • Aumenta (o lancia) un Error (diciamo NoParagraphNumberError ) e gestisci l'errore dall'ambiente chiamante.

Nel seguente codice, restituisco None ma è preferibile lanciare un Error , ad es. perché aumenterà la leggibilità, la manutenibilità del codice o per qualsiasi altro motivo?

import re

BASIC_CASE_PATTERN = r'\d{1,6}/\d+'
BASIC_PARAGRAPH_PATTERN = ur'(paras?(\W|\s)|paragraphs?)'


def check_case_citation(citation_string):
    """
    Check the citation string for occurence of patterns
    Returns:
        str: if just a case number is found
        None: if no case number is found or the citation includes paragraph numbers
    """
    paragraph = re.compile(BASIC_PARAGRAPH_PATTERN)
    casepattern = re.compile(BASIC_CASE_PATTERN)

    match = re.search(casepattern, citation_string)

    #1. entries with case number(s) but no paragraph given
    if match and re.search(paragraph, citation_string) is None:
        return match.group()
    else:
        return None


print check_case_citation("Case 145/80") # 145/80
print check_case_citation("Case 145/80 paragraph 3") # None
    
posta Yannis P. 06.04.2016 - 17:13
fonte

1 risposta

3

Sicuramente opterei per l'opzione return None . Alzare un'eccezione può aumentare la leggibilità (sebbene ne dubito) sulla funzione stessa, ma gestirla è più caotica. Se si return None , dalla funzione chiamante è possibile effettuare le seguenti operazioni:

citation = check_case_citation("Case 145/80")
if citation:
   # Do something
else:
   # Do something else

mentre, se aumenti un'eccezione, avresti qualcosa di simile a

try:
   citation = check_case_citation("Case 145/80")
   # Do something
except NoParagraphNumberError:
   # Do something else

La terza opzione, come suggerisce Mathias Ettinger, sarebbe di fare

try:
   citation = check_case_citation("Case 145/80")
except NoParagraphNumberError:
   # Do something else
else:
   # Do something

Non so voi, ma per me la prima alternativa sembra la più pulita e la più semplice ...

    
risposta data 06.04.2016 - 17:34
fonte

Leggi altre domande sui tag