Nathan Pinno said unto the world upon 08/07/2005 16:14: > Thanks, Danny and all. > > Adjusted the code, here is the newest code and error:
<snip> > def add_login_command(site,filename): > print "Add a login info card" > site = raw_input("Site: ") > id = raw_input("User ID: ") > passcard = raw_input("Password: ") > sitelist[site] = [id,passcard] <snip> > while menu_choice != "9": > menu_choice = raw_input("Choose an option: ") > if menu_choice == "1": > add_login_command() <snip> > Error Message: > Traceback (most recent call last): > File "D:\password.py", line 73, in ? > add_login_command() > TypeError: add_login_command() takes exactly 2 arguments (0 given) > > How do I fix it so that it runs properly, and any other errors that have > to be fixed? Hi Nathan, (Having just finished this long email up, I see that Danny is quicker, terser, and more to the point than I am. But I hate to waste the effort, so I'm sending anyway. In case of conflict, go with what Danny said :-) First, I mean what I am about to say as a constructive comment. It seems like you have been getting an error message and then posting the error msg and entire generating code to the list. It is good you are giving the exact error msg now, but posting the entire code isn't really the best idea. It would be much better if you instead tried to post a smaller chunk of the code that still exhibits the behaviour you'd like help with. (My snips don't leave it running but that is the general idea.) This is good for 2 reasons: 1) It makes it less time-consuming for those who want to help you, and 2) It is a great way of helping yourself. Trimming things down is a valuable way for you to gain general understanding *and* will often result in your determining the answer to your own question. No one on the list minds helping, that's what its for (and goodness knows, I'm grateful for the hours and hours of effort list members have put into helping me). But, the ultimate point is to learn to help yourself, right? :-) So, to your particular problem: Look at the code that remains above. The error msg is complaining that the function add_login_command takes 2 arguments and that it was called with none. And sure enough, if you look at your def block for the function: def add_login_command(site,filename): # code goes here and the block causing the error: if menu_choice == "1": add_login_command() you've called it with no arguments at all. Hence the poor Python interpreter is confused. So, minimally, to fix it, you need to either pass arguments to the function call or to remove the arguments from the function definition. I'm not sure what your overall intent is, so it is hard to say. I also wonder if you understand the role of the arguments in function definitions. Several functions you defined take site as one of their arguments, but do nothing with it other than rebind the name to the result of a raw_input() call. In that case, it isn't clear why you should have the argument. Compare these: IDLE 1.1.1 >>> def very_silly_print_function(the_argument): the_argument = raw_input('What should I print?') print the_argument >>> def slightly_less_silly_print_function_no_arg(): the_value = raw_input('What should I print?') print the_value >>> def slightly_less_silly_print_function_arg(the_argument): print the_argument >>> very_silly_print_function('This will not be printed') What should I print?This will be printed instead This will be printed instead >>> slightly_less_silly_print_function_no_arg() What should I print?This will be printed This will be printed >>> slightly_less_silly_print_function_arg('As will this') As will this >>> So, your functions that take site in as an argument and only reference it by site = raw_input(some_prompt_here) are kind of like the very_silly_print_function above. But, it is a bit worse than that. The very_silly_print_function reassigns the name and then does something with it. You only reassign. Then, when your function ends, you drop the name on the floor :-) Take a look at this: >>> def name_dropper(): name_inside_function = raw_input('What is your moniker?') >>> name_dropper() What is your moniker?Brian >>> name_inside_function Traceback (most recent call last): File "<pyshell#20>", line 1, in -toplevel- name_inside_function NameError: name 'name_inside_function' is not defined >>> The name name_inside_function only exists (so to speak) inside the function. To make it meaningful in your top-level (i.e. not inside a function of class) code, you've got to bind it in the top-level: >>> name_inside_function = 'Misleadingly named string that exists at top-level' >>> name_inside_function 'Misleadingly named string that exists at top-level' >>> name_dropper() What is your moniker?Brian >>> name_inside_function 'Misleadingly named string that exists at top-level' >>> But now there are two names name_inside_function. One in your function scope, one in the top-level or global scope. To make the assignment to the name inside the function affect your top-level name, you've got to do something like: >>> def name_keeper(): name_inside_function = raw_input('What is your moniker?') return name_inside_function >>> top_level_name = name_keeper() What is your moniker?Brian >>> top_level_name 'Brian' >>> (There are other ways, but that's enough for now.) I hope that there is some help in all that :-) Best, brian vdB _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor