Which style is preferable?
Lonnie Princehouse
finite.automaton at gmail.com
Fri Jul 16 16:35:13 EDT 2004
Why do type checking at all?
Element-wise addition will raise an exception if you're trying to add
two elements that can't be added. If you insist on type checking, then
mechanisms like implicit conversion (i.e. int->float) and overloaded
operators won't have a chance to work their magic.
PS- Try making Vector a subclass of list:
class Vector(list):
def __add__(self, other):
return Vector([ a + b for a, b in zip(self, other)])
>> x = Vector([1.0, 2.0, 3.0])
>> y = Vector([4.0, 5.0, 6.0])
>> x + y
[5.0, 7.0, 9.0]
# Since we're not type checking, we can add a list to a vector:
>> Vector([1.0, 2.0]) + [100, 200]
[101.0, 202.0]
# And we can do all sort of other novel things
>> Vector('hello') + Vector('world')
['hw', 'eo', 'lr', 'll', 'od']
Antoon Pardon <apardon at forel.vub.ac.be> wrote in message news:<slrncffner.lnv.apardon at trout.vub.ac.be>...
> For the sake of this question I'm writing a vector class. So
> I have code something like the following
>
>
> from types import *
> import operator
>
>
> class Vector:
>
> def __init__(self, iter):
>
> self.val = [ el for el in iter ]
> for el in self.val:
> if not isinstance(el, FloatType):
> raise TypeError
>
>
> def __add__(self, term):
>
> if ! isinstance(term, Vector):
> raise TypeError
> if len(self.val) != term.val:
> raise ValueError
> resval = map(operator.add, self.val, term.val)
> return Vector(resval)
>
>
> The problem I have with the above code is, that I know
> that resval will contain only floats so that calling
> Vector with resval will needlessly do the type checking.
>
>
> So one way to solve this would be to have a helper
> function like this:
>
> def _Vec(lst)
>
> res = Vector()
> res.value = lst
> return res
>
>
> The last line of the __add__ method would then
> look like this.
>
>
> return _Vec(resval)
>
>
> But I'm not really satified with this solution either
> because it needs a double call to generate an unchecked
> Vector.
>
>
> So I would prefer to write it like this:
>
>
> def Vector(iter):
>
> lst = [ el for el in iter ]
> for el in lst:
> if not isinstance(el, FloatType):
> raise TypeError
> return _Vec(lst)
>
>
> class _Vec(lst):
>
> def __init__(self, lst):
> self.val = lst
>
> def __add__(self, term):
>
> if ! isinstance(term, _Vec):
> raise TypeError
> if len(self.val) != term.val:
> raise ValueError
> resval = map(operator.add, self.val, term.val)
> return _Vec(resval)
>
>
> The only problem with this is that it is awkward
> to use with isinstance and such, so I would finaly
> add the folowing:
>
> VectorType = _Vec
>
>
> My question now is, would this be considered an acceptable
> style/interface whatever to do in python?
More information about the Python-list
mailing list