Orest Kozyar wrote:
> I have the following code:
> 
> class meta(type):
> 
>       def __call__(cls, *args, **kwargs):
>               argnames = inspect.getargspec(cls.__init__)[0]
>               for i, value in enumerate(args):
>                       kwargs[argnames[i]] = value

This could be written
   kwargs.update(zip(argnames, args))

>               return type.__call__(cls, kwargs)

You are passing kwargs as a positional argument to __call__(); i.e. 
passing the dict as an ordinary parameter. To use kwargs as the keyword 
dict for the call, use the syntax
   type.__call__(cls, **kwargs)

> class test(object):
> 
>       __metaclass__ = meta
> 
>       def __init__(self, x, y, **kwargs):
>               pass
> 
> However, inspect.getargspec(cls.__init__) appears to return only the
> arguments of the meta __init__ rather than the test __init__.  Is there any
> way I can get access to the test __init__ function from the metaclass?

It works for me:

import inspect

class meta(type):
        def __call__(cls, *args, **kwargs):
                print inspect.getargspec(cls.__init__)
                return type.__call__(cls, *args, **kwargs)

class test(object):
        __metaclass__ = meta

        def __init__(self, x, y, **kwargs):
                pass

test(1, 2)

prints (['self', 'x', 'y'], None, 'kwargs', None)


I think the problem is elsewhere in your code. When I use
   return type.__call__(cls, kwargs)

I get
   TypeError: __init__() takes exactly 3 arguments (2 given)

because test.__init__() is still expecting the two required positional 
arguments.

Why are you doing this?

Kent
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to