making a class return None from __init__

Alex Martelli aleax at aleax.it
Sat Oct 5 12:16:00 CEST 2002


Erik Max Francis wrote:

> Rajarshi Guha wrote:
> 
>>   I have a class which makes some basic error checks in the __init__
>> function. Ideally, if the parameters passed to the __init__ function
>> fail
>> the checks I would like to return a None. But this does'nt seem to
>> happen:
> ...
>> (where v will fail) I always get <__main__.Graph instance at 0xXXXXXX>
>> Is there any way to make the constructor return a None object?
> 
> The return value of constructors is not used for anything; besides, the

Hmmm, it's used to check that it's None and give an exception otherwise...:

[alex at lancelot ba]$ python
Python 2.3a0 (#1, Oct  4 2002, 13:05:05)
[GCC 2.96 20000731 (Mandrake Linux 8.2 2.96-0.76mdk)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class X:
...   def __init__(self):
...     return 1
...
>>> x = X()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: __init__() should return None
>>>

That's probably what you mean, but I just thought I'd clarify it.

> default return value of any function without an explicit return
> statement is None in the first place.
> 
> The proper way to handle this case is to raise an exception from the
> constructor if something goes wrong.  If you so desired you could wrap
> the creation of the object in a secondary function which catches the
> error and returns None instead of it catches an error:
> 
> def protectedGraph(v):
> try:
> return Graph(v)
> except SomeError:
> return None

Yes to all of this -- a factory function of some kind or another is
the best approach when you're not sure what type of object you want
to generate (and None is a different type from Graph, so this is
a case in point:-).  In modern Python you can dress up such a
function as a class's static method __new__, but keeping it as a
separate function is often preferable anyway -- clearer, simpler,
more portable to older Python versions (e.g., the current release
of Jython, which still implements the Python 2.1 language).


Alex




More information about the Python-list mailing list