Denis, this mail was very comprehensive, and went a long way of driving it all home for me. There are several different concepts that are involved in this simple problem that I had, and you guys explaining them has really expanded my pythonic horizon, especially the explanations
on the argv module, and also the idea of
from <module> import <function> as <saveImportedFuncUnderThisName>

Thanks a lot, everybody. :-)

Dayo
------------------
spir wrote:
Le Sun, 26 Apr 2009 22:35:36 +0100,
Dayo Adewunmi <contactd...@gmail.com> s'exprima ainsi:

How can I

a) Open my shell, and do something like: $ python countdown.py but have it take an argument and pass it to the function, and execute.

When your code is (nicely) organised as a set of funcs or class definitions, you also need a 
"laucher" usually called "main()". Otherwise python only parses and records the 
definitions into live objects that wait for someone to tell them what they're supposed to do. I'll 
stick first at processes without any parameter, like if your func would always countdown from 10.
There are several use patterns:

(1) Program launched from command line.
Just add a call to your func:
   countdown(10)

(2) Module imported from other prog
Nothing to add to your module.
Instead, the importing code needs to hold:
   import countdown                     # the module (file)
   ...
   countdown.countdown(n)               # the func itself
or
   from countdown import countdown      # the func, directly
   ...
   countdown(n)

(3) Both
You need to differenciate between launching and importing. Python provides a 
rather esoteric idiom for that:
   <func def here>
   if __name__ == "__main__":
      countdown(10)
The trick is that when a prog is launched directly (as opposed to imported), it silently 
gets a '__name__' attribute that is automatically set to "__main__". So that 
the one-line block above will only run when the prog is launched, like in case (1). While 
nothing will happen when the module is imported -- instead the importing code will have 
the countdown func available under name 'countdown' as expected, like in case (2). Clear?

b) Import the function in the interactive interpreter, and call it like so:

        countdown(10)

without getting the abovementioned error.

In the case of an import, as your func definition has the proper parameter, you 
have nothing to change.
While for a launch from command-line, you need to get the parameter given by 
the user.
But how? Python provides a way to read the command-line arguments under an 
attribute called 'argv' of the 'sys' module.
argv is a list which zerost item is the name of the file. For instance if called
   python countdown.py 9
argv holds: ['countdown.py', '9']
Note that both are strings. Then you can catch and use the needed parameter, 
e.g.

from time import sleep as wait
from sys import argv as user_args

def countdown(n=10):
        if n <= 0:
                print 'Blastoff!'
        else:
                wait(0.333)
                print n
                countdown(n-1)
                
def launch():
        if len(user_args) == 1:
                countdown()
        else:
                n = int(user_args[1])
                countdown(n)

if __name__ == "__main__":
        launch()

(You can indeed put the content of launch() in the if block. But I find it 
clearer that way, and it happens to be a common practice.)

Denis
------
la vita e estrany
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to