Will McGugan: > I am writting a Vector3D class as a teaching aid (not for me, for > others), and I find myself pondering over the __init__ function. I want > it to be as easy to use as possible (speed is a secondary > consideration).
If optimizations are less important, then don't use __slots__, it simplifies OOP management of it. I think that accepting a single iterable too makes the calling a bit too much elastic, so it can produce silent problems. Something like this may be better: from itertools import imap class Vector3D(object): def __init__(self, *args): len_args = len(args) if len_args == 3: self.x, self.y, self.z = imap(float, args) elif len_args == 0: self.x = self.y = self.z = 0 else: raise TypeError("...") If you don't like imap, you can change that code. If you want to accept single parameter too then you can use something like: class Vector3D(object): def __init__(self, *args): len_args = len(args) if len_args == 3: self.x, self.y, self.z = imap(float, args) elif len_args == 1: self.x, self.y, self.z = imap(float, args[0]) elif len_args == 0: self.x = self.y = self.z = 0 else: raise TypeError("...") If you don't like the explicit raising of an error you may use: class Vector3D(object): def __init__(self, first=None, *other): if first: if other: self.x = float(first) self.y, self.z = imap(float, other) else: self.x, self.y, self.z = imap(float, first) else: self.x = self.y = self.z = 0 But this last code is less readable. Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list