>>>>> Lacrima <lacrima.ma...@gmail.com> (L) wrote:

>L> Hello!
>L> For example I have two classes:

>>>>> class First:
>L>     def __init__(self, *args, **kwargs):
>L>             pass

>>>>> class Second:
>L>     def __init__(self, somearg, *args, **kwargs):
>L>             self.somearg = somearg

>L> How can I test that First class takes 1 required argument and Second
>L> class takes no required arguments?
>L> So that I could instantiate them in a for loop.

>>>>> a = [First, Second]
>>>>> for cls in a:
>L>     instance = cls()

>L> Traceback (most recent call last):
>L>   File "<pyshell#22>", line 2, in <module>
>L>     instance = cls()
>L> TypeError: __init__() takes at least 2 arguments (1 given)

>L> Of course, I can do like this:
>>>>> for cls in a:
>L>     try:
>L>             instance = cls()
>L>     except TypeError:
>L>             instance = cls('hello')

>>>>> print instance.somearg
>L> hello

>L> But what if I have to instantiate any class with 3 or 4 required
>L> arguments? How can I do it?

cls.__init__.im_func.__code__.co_argcount

This will include self, so it will be 1 in First and 2 in Second.

However this is very dirty trickery and should not be recommended. It
may also change in future versions and other implementations of Python.

I think it would be cleaner to put a class attribute in the classes that
defines how they should be initialized (e.g. just the number of required
arguments or more specific information) or have a special factory method
for this use case.
-- 
Piet van Oostrum <p...@cs.uu.nl>
URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4]
Private email: p...@vanoostrum.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to