[Python-il] Code Review: Kakurasu Solver
Shlomi Fish
shlomif at iglu.org.il
Tue Nov 9 00:17:48 IST 2010
Hi Amit,
On Tuesday 26 October 2010 01:46:29 Amit Aronovitch wrote:
> On Tue, Oct 26, 2010 at 12:26 AM, cool-RR <cool-rr at cool-rr.com> wrote:
> > On Mon, Oct 25, 2010 at 6:49 PM, Shlomi Fish <shlomif at iglu.org.il> wrote:
> >> > I have a few general notes:
> >> > 1. Use new-style classes. (Inherit every class from `object`.)
> >>
> >> What does that give me? Is it compatible with older versions of python?
> >
> > Here's a piece by Guido:
> > http://python-history.blogspot.com/2010/06/new-style-classes.html
> >
> > And a StackOverflow question:
> >
> > http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-
> > in-python
> >
> > Old-style classes are deprecated and you should never use them.
>
> I actually wanted to say that you can't use descriptors on old-styles (plug
> for my own ravings http://alturl.com/kiz2r , but for me, this would
> actually be a practical reason in favor on new-styles, since I do use
> @cprop quite often)...
>
> But then I saw shlomif using @staticmethod, which I thought should cause an
> error in his program - and apparently it *does work*!
> A little test shows that even user defined descriptors do get called with
> old classes...
>
> Checking the docs:
>
> http://docs.python.org/reference/datamodel.html#descriptors says:
> "Note that descriptors are only invoked for new style objects or classes
> (ones that subclass
> object()<http://docs.python.org/library/functions.html#object>or
> type() <http://docs.python.org/library/functions.html#type>)."
>
> WTF?
>
> Well, it turns out that it is not the object (the owner of the attribute)
> that has to be new-style. It's the descriptor (the attribute - e.g.
> property/staticmethod/etc.) itself that must be new.
> Makes some sense, but the docs *are* misleading (the word "for" is a bad
> choice, should be something like "if they are" instead), and I think the
> StackOverflow posters and probably others were misled by it, as I was.
>
> I also like using type(obj) rather than obj.__class__ (and maybe some
> debuggers/IDE's/autodoc-systems make use of such interfaces and would
> sooner or later deprecate support for old-style classes).
>
>
> > About compatibility: I think new-style classes go back to Python 2.2.
>
>
> True. But there *is* ancient code out there (though personally I prefer
> future compatibility if I have a choice)
> For old Pythons, adding "class object: pass" would probably make it work
> (but then you might have other problems, such as iterators, nested scopes
> etc. that just do not work in 2.1).
>
Interesting discussion that. I don't care too much about compatibility with
Python-2.1 and below, because they are very old. Not sure what is the minimal
version of Python that the lp_solve bindings work with anyhow.
> <--- some style-related comments snipped --->
>
> I also did not look too deep into the code, but I did notice that
> _process_constraints does not use self at all,
I moved _process_constrains to Params as you suggested below.
> and its caller
> _calc_params_obj only uses it to copy some attributes. This probably
> indicates some OO design issue (probably these methods belong in the Params
> class, possibly in/called by a constructor) - I'm sure with a little
> rethinking you can make your code shorter and more readable.
I moved them to the Params class, thanks:
http://bitbucket.org/shlomif/lp-based-puzzle-solvers
I'm now thinking that maybe I should extract the duplicate logic of the
horizontal and vertical constraints into a common class. But I couldn't figure
out a good way to do that back when I wrote it.
>
> I also think that instead of the last three or so _print_x / _output_x
> functions, you could do something like
>
> for row in sol:
> print "".join(map(_cell_as_text, row))
>
> (or you could make it a three-liner and a bit more readable, still faster
> to understand than tracking functionality down through three function
> calls IMO)
Yes, this was the case of over-refactoring. I changed it to your version now.
> (and BTW, why the "_" prefix in _print_sol? After all, if you call it from
> your main, you probably do not want to make it private).
Don't know, I didn't want to expose it. I now changed it to
print_sol_to_screen_as_unicode without the prefix.
Does anyone have any more comments?
Regards,
Shlomi Fish
--
-----------------------------------------------------------------
Shlomi Fish http://www.shlomifish.org/
Best Introductory Programming Language - http://shlom.in/intro-lang
<rindolf> She's a hot chick. But she smokes.
<go|dfish> She can smoke as long as she's smokin'.
Please reply to list if it's a mailing list post - http://shlom.in/reply .
More information about the Python-il
mailing list