2013-12-11 4 views
2

im пытается вызвать функцию внутри оператора if, но не работает. Это одна из моих первых попыток использования Python. Что я делаю не так?Вызывающая функция внутри оператора if

#!/usr/bin/python 


menu = raw_input ("Hello, please choose form following options (1,2,3) and press enter:\n" 
    "Option 1\n" 
    "Option 2\n" 
    "Option 3\n") 

if menu == str("1"): 
    savinginfile = raw_input ("Please, state your name: ") 
    option1() 
elif menu == str("2"): 
    print ("Option 2") 
elif menu == str("3"): 
    print ("Option 3") 

def option1(): 
    test = open ("test.txt", "rw") 
    test.write(savinginfile) 
    print ("Option 1 used") 
    test.close() 
+2

Что не работает? Вы получаете код ошибки ?? Пожалуйста, дополните. – jramirez

ответ

2

Вам необходимо определить свою функцию, прежде чем пытаться ее вызвать. Просто поставьте def option1(): #and all that code below it над вашими заявлениями if.

Это также плохая практика бросить слишком много глобальных переменных. Вы не должны использовать так, как вы есть - вместо этого передайте его функции как параметр и позвольте функции работать в своей области. Вам нужно будет передать функции имя файла для использования, прежде чем он сможет использовать . Попробуйте вместо этого:

def option1(whattosaveinfile): 
    test = open("test.txt","a+") #probably better to use a with statement -- I'll comment below. 
    test.write(whattosaveinfile) #note that you use the parameter name, not the var you pass to it 
    print("Option 1 used") 
    test.close() 

#that with statement works better for file-like objects because it automatically 
#catches and handles any errors that occur, leaving you with a closed object. 
#it's also a little prettier :) Use it like this: 
# 
# with open("test.txt","a+") as f: 
# f.write(whattosaveinfile) 
# print("Option 1 used") 
# 
#note that you didn't have to call f.close(), because the with block does that for you 
#if you'd like to know more, look up the docs for contextlib 

if menu == "1": #no reason to turn this to a string -- you've already defined it by such by enclosing it in quotes 
    savinginfile = raw_input("Please state your name: ") 
    option1(savinginfile) #putting the var in the parens will pass it to the function as a parameter. 

elif menu == "2": #etc 
#etc 
#etc 
+0

Вы не можете открыть файл в режиме 'rw' (его не существует). Я думаю, было бы лучше использовать 'a +' здесь. – iCodez

+0

Отмечено и отредактировано в ответе. (Я не очень откровенно разбираюсь с файлами чтения/записи в файлы - я должен каждый раз искать его) –

2

рекомендуем Вам пройти в качестве параметра:

def option1(savinginfile): 
    test = open ("test.txt", "rw") 
    test.write(savinginfile) 
    print ("Option 1 used") 
    test.close() 

Вам нужно определить option1 перед вызовом. Python интерпретирует сверху вниз.

+1

Просто небольшая коррекция, в коде JD, сохранение файла как глобальной переменной не выходит за рамки внутри опции1. option1() будет автоматически искать глобальное пространство имен. Единственная проблема: опция option1 не определена до вызова. Как вы предположили, передача saveinfile в качестве параметра и определение опции1 перед вызовом - это правильный способ его решения. –

+0

@TwistedMeadow. Вы правы! Все еще плохая практика, но я обновлю свой ответ (выше), чтобы это отразить. –

+0

Хороший улов @TwistedMeadow, не заметил, что 'if else' был на верхнем уровне. ответ изменен – qwwqwwq

Смежные вопросы