2010-10-05 17 views
6

In generale, è ragionevole restituire None da un metodo __new__ se l'utente della classe sa che a volte il costruttore valuterà su Nessuno?Va bene restituire None da __new__?

La documentazione non implica che sia illegale e non vedo alcun problema immediato (dal momento che __init__ non verrà chiamato, Nessuno non è un'istanza della classe personalizzata in questione!). Ma io sono preoccupato per

  1. se potrebbe avere altri problemi imprevisti
  2. se si tratta di una buona pratica di programmazione per avere costruttori tornare Nessuno

esempio specifico:

class MyNumber(int): 
    def __new__(cls, value): # value is a string (usually) parsed from a file 
     if value == 'N.A.': 
      return None 
     return int.__new__(cls, value) 

risposta

7

E ' non illegale. Se non viene fatto nulla di strano con il risultato, funzionerà.

+1

o meglio, funziona. Tentando di fare quasi nulla di interessante con il risultato, non lo farò. Ma probabilmente è parte del punto. – aaronasterling

3

Si dovrebbe evitare questo. La documentazione non elenca in modo esaustivo le cose che non dovresti fare, ma dice cosa __new__dovrebbe do: restituire un'istanza della classe.

Se in alcuni casi non si desidera restituire un nuovo oggetto, generare un'eccezione.

+1

Ma la documentazione dice anche che se un'istanza della classe non viene restituita, __init__ non viene chiamato. L'ho letto come implicitamente permettendo di restituire non-istanza della classe. Per quanto riguarda le eccezioni, è un po 'più di lavoro per l'utente; invece di controllare che l'oggetto non sia None, devono provare e rilevare le eccezioni. – max

+0

+1 per errore ValueError in questo caso. – Daenyth

+0

Oppure è un po 'meno lavoro per l'utente, se l'utente si aspetta di gestire gli errori per un blocco di codice con un unico gestore di eccezioni (che è l'intero punto delle eccezioni). Due cose da ricordare: la gestione degli errori in Python è di solito (non * sempre *, ma la maggior parte delle volte) fatta tramite eccezioni; e avere un costruttore * non * costruire un oggetto è la definizione stessa di * comportamento eccezionale *. –