2010-10-05 18 views
6

En general, ¿es razonable devolver None desde un método __new__ si el usuario de la clase sabe que a veces el constructor evaluará a None?¿Está bien que devuelva None desde __new__?

La documentación no implica que sea ilegal, y no veo ningún problema inmediato (ya que no se va a llamar al __init__, ¡Ninguno no es una instancia de la clase personalizada en cuestión!). Pero lo que me preocupa

  1. si podría tener otros problemas imprevistos
  2. si se trata de una buena práctica de programación para tener constructores volver Ninguno

Ejemplo específico:

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) 

Respuesta

7

Es no ilegal. Si no se hace nada raro con el resultado, funcionará.

+1

o mejor dicho, _will_ work. Intentar hacer casi cualquier cosa interesante con el resultado _no será_. Pero eso es probablemente parte del punto. – aaronasterling

3

Debe evitar esto. La documentación no enumera exhaustivamente las cosas que no debe hacer, pero dice que __new__debería hacer: devolver una instancia de la clase.

Si no desea devolver un objeto nuevo en algunos casos, genere una excepción.

+1

Pero la documentación también dice que si no se devuelve una instancia de la clase, __init__ no se llama. Lo leí como implícitamente permitiendo regresar no instancia de la clase. En cuanto a las excepciones, es un poco más trabajo para el usuario; en lugar de simplemente verificar que el objeto no sea Ninguno, deben intentar detectar excepciones. – max

+0

+1 para ValueError en este caso. – Daenyth

+0

O es un poco menos trabajo para el usuario, si el usuario espera manejar los errores de un bloque de código con un único manejador de excepciones (que es el objetivo de las excepciones). Dos cosas para recordar: el manejo de errores en Python suele ser (no * siempre *, pero la mayoría de las veces) hecho a través de excepciones; y tener un constructor * no * construir un objeto es la definición misma de * comportamiento excepcional *. –

Cuestiones relacionadas