On 4 Apr, 00:58, kj <no.em...@please.post> wrote: > Suppose I have a function with the following signature: > > def spam(x, y, z): > # etc. > > Is there a way to refer, within the function, to all its arguments > as a single list? (I.e. I'm looking for Python's equivalent of > Perl's @_ variable.) > > I'm aware of locals(), but I want to preserve the order in which > the arguments appear in the signature. > > My immediate aim is to set up a simple class that will allow me to > iterate over the arguments passed to the constructor (plus let me > refer to these individual arguments by their names using an > instance.attribute syntax, as usual). > > The best I have managed looks like this: > > class _Spam(object): > def __init__(self, x, y, z): > self.__dict__ = OrderedDict(()) > for p in inspect.getargspec(_Spam.__init__).args[1:]: > self.__dict__[p] = locals()[p] > > def __iter__(self): > return iter(self.__dict__.values()) > > but rolling out inspect.getargspec for this sort of thing looks to > me like overkill. Is there a more basic approach? > > P.S. this is just an example; the function I want to implement has > more parameters in its signature, with longer, more informative > names.
Hi, I once tried something to emulate in python the way Scala language allows to automatically generate class attributes from constructor parameter. I never tried in real code, but see if it fits your bill. It uses class decorators though, so only works with python3. Here is my code: class FieldsDecorator: """It adds a generic scala-like constructor to a class. You can create as instance as c = MyClass(f1=3, f2=4) and have automatically c.f1=3, c.f2=4. Only parameter names listed in the decorator are allowed. """ def __init__(self, *names): self.names = names def __call__(self, cls): def constructor(instance, **kwds): for n,v in kwds.items(): if n in self.names: setattr(instance, n, v) else: raise TypeError("%s is not a valid field" % s ) setattr(cls, '__init__', constructor ) return cls @FieldsDecorator("uno", "due") class Prova: pass p = Prova(uno=12, due=9) print (p.uno, p.due ) Ciao ---- FB -- http://mail.python.org/mailman/listinfo/python-list