On May 6, 3:36 pm, Chris Rebert <c...@rebertia.com> wrote: > On Wed, May 6, 2009 at 5:24 AM, Piet van Oostrum <p...@cs.uu.nl> wrote: > > > > >>>>>> 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. > > AFAICT, that would count non-required arguments too, which isn't > strictly what the OP requested. > > > However this is very dirty trickery and should not be recommended. It > > may also change in future versions and other implementations of Python. > > Very much agreed. > > > 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. > > Seconded. I'd recommend the latter personally, though it's impossible > to give a definitive answer without more context. > > Cheers, > Chris > --http://blog.rebertia.com
Thanks for all of you! I think I'll try to write a special method for this case and will report you result. -Max -- http://mail.python.org/mailman/listinfo/python-list