Duncan Booth wrote: > No it isn't Pythonic. Why not just require 3 values and move the > responsibility onto the caller to pass them correctly? They can still use > an iterator if they want: > > Vector3D(a, b, c) > Vector3D(*some_iter)
I kind of liked the ability to partially use iterators. It would be convenient for reading in from a file for example f = file( "model.txt" ) v1 = Vector3D( f ) v2 = Vector3D( f ) v3 = Vector3D( f ) Which you couldnt do with a tuple, because the * syntac would attempt to read the entire file (I think). > > Then your initialiser becomes: > > def __init__(self, x=0, y=0, z=0): > self.x, self.y, self.z = x, y, z > > much cleaner and also catches accidental use of iterators. > > Alternatively, insist on always getting exactly 0 or 1 arguments: > > Vector3D((a,b,c)) > Vector3D(some_iter) > > def __init__(self, (x, y, z)=(0,0,0)): > self.x, self.y, self.z = x, y, z > > which is great if you already have lots of 3-tuples, but a pain otherwise > to remember to double the parentheses. Hmm. Not keen on that for the reason you mentioned. For my particular use case there would be a lot of Vector3D 'literals'. -- http://mail.python.org/mailman/listinfo/python-list