On 07/14/2013 12:37 AM, Jim Mooney wrote:
On 13 July 2013 20:03, Steven D'Aprano <st...@pearwood.info> wrote:
I don't understand that last sentence.
Ah, I can be marvelously unclear. I keep forgetting telepathy only works
on my home planet ;')
You still have done nothing to explain the "last sentence." You obscure
that fact by not even keeping the context as to what the sentence was.
Repeating it for your edification, and our mystification:
"""Generators are one-off and input
is one-off, so they match well for testing, for instance.
"""
I wiped everything out to start fresh with Py27, so this is just a very
simple example of what worked in sending a few million test integers to my
numbers-to-name program, which normally took typed input. The real test
program used randoms to go up to the decillions and a straight count to go
into the quadrillions, for about 40 tests (before my CPU overheated, this
being Arizona ;')
No doubt there is a standard way to do this, but I wanted to test the
numbers program quickly, without mooching all over the net, so I threw
something like this together:
# The module I import, inputter.py:
#Using Python 2.7 on Win 7
def inp():
x = raw_input('type a number: ')
return x
def intest():
if int(inp()) < 10:
print('smallnum')
else:
print('bignum')
def main():
intest()
if __name__ == '__main__':
main()
# The Test Program, test.py that imports the module above:
# Using Python 2.7 on Win 7
import inputter
x = (x for x in xrange(8,13)) # much bigger, and sometimes random, in the
real test program
def testfunc(): # This is where my typed input is replaced
return next(x)
inputter.inp = testfunc
That's monkey-patching. You're reaching inside the module and modifying
it. That's fine since you wrote both of them, but it makes things quite
hard to debug in more complex cases, and especially if you didn't write
the target module.
for cnt in range(0,5):
inputter.intest()
'''result:
smallnum
smallnum
bignum
bignum
bignum
'''
One of the techniques the inputter module should have used is a
callback. You pass a function as a parameter, and it calls that
function. You can make a default value, of course, to make it easy to test.
Anyway, in inputter.py, you'd have
def intest(func=inp):
if int(func()) < 10:
print('smallnum')
else:
print('bignum')
and in your calling module, you would remove the monkeypatch, and just call
for cnt in range(0,5):
inputter.intest(testfunc)
The real problem I have is with your original code. It mixed input, and
calculations inside the same function, so you had to patch things up to
test it from outside. If you had refactored it as I suggested way back
then, and Steven suggested even better, this all would have been a
non-problem.
--
DaveA
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor