[TIP] alphabetical order in testing
Mark Sienkiewicz
sienkiew at stsci.edu
Thu Jan 21 07:11:19 PST 2010
holger krekel wrote:
> On Wed, Jan 20, 2010 at 17:09 -0500, Mark Sienkiewicz wrote:
>
>> In that case, there is some clever python feature that I don't know
>> about. How does it work? Is it easier than
>> import os
>> l = dir(os)
>>
>
> functions have a bytecode object which has a co_firstlineno line
> number - you can use that to sort. If you insist on oneliners:
>
> sorted(vars(os).items(), key=lambda x:
> getattr(getattr(x[1], 'func_code', None), 'co_firstlineno', 0))
>
> In practise i'd rather write this as a five-liner.
>
No, I don't insist on one-liners. I agree: if I were to write
something like this (which I can do now that I know how) I would write
it as about 5 lines of code and another 5 lines of comments explaining
how it works. I'm not a fan of taking 5 simple lines and cramming them
into 1 complicated line.
But this example points out a general philosophical difference that I
think would be useful to the group:
I consider "l = dir(os)" to be simpler for two reasons. The LESS
important reason is that it contains a single function call.
The more important reason is:
You can hardly learn python without being aware of dir(); If I asked any
random python programmer "How do you get a list of the symbols in a
module, sorted alphabetically?" I would expect the answer "l = dir(mod)"
or maybe "l = dir(mod); l.sort()". That is easy for just about anybody
who can write python.
For comparison, I've been using python for years, and I have never seen
documentation for the interface in this example. (I don't claim that it
is undocumented -- just that I have never seen it, and after flipping
through the table of contents of the standard library, it is not obvious
to me where to look for it.) If I don't know about it, then my first
task is to ask "how would I find this information?", which would mean
searching the documentation, then possibly reverse engineering the
python interpreter if I did not find anything useful. Compare with just
a few seconds to write code that uses dir().
So in a way, we're both right, in slightly different domains: Listing
the functions alphabetically is easy, for just about anybody. Listing
the functions by line number is easy, for anybody who knows about this
interface.
Of course, there is no "rule of programming" that falls out of this
observation. It's just something that we should all be aware of.
Mark S.
More information about the testing-in-python
mailing list