Best way to make a weighted sum

Steven Taschuk staschuk at telusplanet.net
Tue Apr 8 21:47:55 EDT 2003


Quoth Jorge Godoy:
> Steven Taschuk <staschuk at telusplanet.net> writes:
> 
> > I don't know why you're using a class for this.  A simple function
> > which calculates (and/or verifies) the checksum seems more natural.
> 
> The class has several other things. As I said, this was a snippet of
> code. It showed you the __init__ and the other methods I was
> interested in discussing.

Ah.  Sorry, I thought you posted the complete class.  My mistake.

  [...]
> The line that does the mod 11 is this one, in case you want to see it:
> 
>         self.modulo = self.soma % 11
> 
> Note that self.soma had other operations before being submitted
> here. Some of our States do really weird things before the modulus
> calculation. And some do these weird stuff after that.

Hm.  Another alternative, then: a dict mapping from state to
checksum function.  For the simple cases in your original message,
something like this:

	checksumfuncs = {}

	def simplechecksum(ie, weights):
		w = weights[-len(ie):]
		return reduce(operator.add, [x*y for x, y in zip(ie, w)]) % 11

	checksumfuncs['CE'] = checksumfuncs['AP'] = \
		lambda ie: simplechecksum(ie, [9, 8, 7, 6, 5, 4, 3, 2])
	checksumfuncs['RJ'] = \
		lambda ie: simplechecksum(ie, [2, 7, 6, 5, 4, 3, 2])

A weird checksum function might look like, for example,

	def weirdchecksum(ie):
		s = simplechecksum(ie, [2, 7, 6, 5, 4, 3, 2])
		# do something weird to s
		return s
	checksumfuncs['AB'] = weirdchecksum

In this approach you might have

	def checksum(ie, state):
		return checksumfuncs[state](ie)

This might adapt better to the cases in which one state has many
ways of computing a checksum; the function for that state chooses
among the various methods by whatever means are appropriate.  (I
assume it's possible to determine the appropriate method by
inspecting ie.)

> > If uf is not in ['CE', 'AP', 'RJ'], then self.pesos simply does not
> > get set; this will cause CalculaSoma to fail later, in a mysterious
> > way.  Better to have an informative exception raised at this point,
> > surely.
  [...]
> Also there will be no exception since this is also bound to a domain
> at the database server.

If it were my program, I'd check anyway, just in case.  At the
least I'd use an assertion.
 
> You enlightened me a lot on this message, thanks.

Glad I could be of help.

> There is a green, multi-legged creature crawling on your shoulder.

Aaah!

-- 
Steven Taschuk                                        staschuk at telusplanet.net
"Study this book; read a word then ponder on it.  If you interpret the meaning
 loosely you will mistake the Way."         -- Musashi, _A Book of Five Rings_





More information about the Python-list mailing list