Brendan wrote: ... > > class Things(Object): > def __init__(self, x, y, z): > #assert that x, y, and z have the same length > > But I can't figure out a _simple_ way to check the arguments have the > same length, since len(scalar) throws an exception. The only ways > around this I've found so far are > ... > > b) use a separate 'Thing' object, and make the 'Things' initializer > work only with Thing objects. This seems like way too much structure > to me. >
Yes, but depending on what you want to do with Things, it might indeed make sense to convert its arguments to a common sequence type, say a list. safelist is barely more complex than sLen, and may simplify downstream steps. def safelist(obj): """Construct a list from any object.""" if obj is None: return [] if isinstance(obj, (basestring, int)): return [obj] if isinstance(obj, list): return obj try: return list(obj) except TypeError: return [obj] class Things(object): def __init__(self, *args): self.args = map(safelist, args) assert len(set(len(obj) for obj in self.args)) == 1 def __repr__(self): return "Things%s" % self.args >>> Things(0,1,2) Things[[0], [1], [2]] >>> Things(range(2),xrange(2),(0,1)) Things[[0, 1], [0, 1], [0, 1]] >>> Things(None, 0,1) Traceback (most recent call last): File "<input>", line 1, in ? File "C:\Documents and Settings\Michael\My Documents\PyDev\Junk\safelist.py", line 32, in __init__ assert len(set(len(obj) for obj in self.args)) == 1 AssertionError Michael -- http://mail.python.org/mailman/listinfo/python-list