making a class return None from __init__
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
>> the checks I would like to return a None. But this does'nt seem to
>> (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):
> 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).
More information about the Python-list