[Tutor] (no subject)

Steven D'Aprano steve at pearwood.info
Sun Jun 13 12:55:58 CEST 2010

On Sat, 12 Jun 2010 07:12:27 am Advertising Department wrote:
> #!/Library/Frameworks/Python.framework/Versions/Current/bin/pythonw
> """still thinking in imperative"
> """

There is absolutely nothing wrong with writing imperative code. Python 
makes it easy to mix imperative, functional and object-oriented code in 
the same application, and in truth you'll soon find that they blend 
into each other so easily that sometimes it's hard to tell the 

> ## obviously this is a bad construct.
> ## Can someone suggest a pythonesque way of doing this?

You have to explain what you are aiming to do.

> def getid():
> 	response  = raw_input('prompt')
> 	if response not in [ "", "y", "Y", "yes"] :
> 		getid()	# ouch
> 	print "continue working"
> 	# do more stuff
> 	# do more stuff

You have comments "do more stuff" (repeated twice, so I suppose that 
means there is a LOT of more stuff) in a function called "getid". 
*That* is a bad programming construct, and not just in Python, and not 
because it is imperative. It is because the getid() function should do 
ONE THING -- get the id, and nothing else.

You should separate the *user interface* from the *backend* (the 
engine). So you should have two functions:

def getid():
    """Return the id."""
    return 123456789  # FIXME everybody has the same id...

def ask_id(prompt):
    prompt = prompt + ' (Y/n) '
    done = False
    while not done:
        response  = raw_input(prompt)
        done = response.lower() in ["", "y", "yes", "n", "no"]
    return response.lower() in ["", "y", "yes"]

And then put them together in your main program like this:

def main():
    if ask_id('Would you like an ID?'):
        x = getid()
    print "Continue working"...
    while ask_id('Would you like another ID?'):
        x = getid()
    print "Done now!"    


Hope this helps.

Steven D'Aprano

More information about the Tutor mailing list