2015-12-01 3 views
1

Основная идея моей функции: Я пытаюсь реплицировать команду unix «cd ../» (что приводит к выбору родительского каталога), однако я хочу иметь возможность вводить «cd. ./../ "(в качестве аргумента командной строки).Рекурсивный вызов функции

Так что я пытаюсь рекурсивный звонок. Функция найдет, если строка содержит «../», и если это произойдет, вызовите мою функцию upOneDir() (которая эффективно изменит каталог программы на родителя), а затем вызовет себя (dotDotSlash()).

def dotDotSlash(): 
    s = sys.argv[2] 
    dotDotSlash = "../" 

    if (s.find(dotDotSlash) == -1): 
     print "not found" 

    else: 
     print "found ../ at: " 
     print s.find(dotDotSlash) 
    upOneDir() 
    dotDotSlash() 

Функция выполняется только один раз, когда я пытаюсь войти «CD ../../», а затем дает мне эту ошибку:

Traceback (most recent call last): 
    File "test3.py", line 59, in <module> 
    dotDotSlash() 
    File "test3.py", line 40, in dotDotSlash 
    dotDotSlash() 
TypeError: 'str' object is not callable 

Любые идеи о том, почему функция не вызывая себя правильно?

+1

Используйте getopt свой встроенный в него python, который удовлетворит ваши потребности. –

+4

вы назвали свою переменную с тем же именем, что и ваша функция. –

+1

'dotDotSlash =" ../ "' это строка с тем же именем 'def dotDotSlash()' имя переменной переменной или имя funciton. – Nilesh

ответ

1

Вы переписали ссылку на функцию. Python не различает имя функции и имя любого другого объекта. Позвоните '../' что-то еще, чтобы оно не мешало.

Также необходимо вернуть рекурсивный вызов, с return dotDotSlash(). Кроме того, вся точка рекурсивной функции заключается в том, что вы отправляете ей аргумент, она изменяет аргумент, а затем снова отправляет модифицированный аргумент функции, пока не дойдет до определенной точки остановки. Я рекомендую попытаться реализовать вашу функцию с помощью цикла, прежде чем пытаться создать рекурсивную версию.

В любом случае, вы можете просто что-то сделать по линиям for i in range(sys.argv[2].count('../')): upOneDir().

+0

Эта функция ничего не должна возвращать –

+0

Спасибо, вы спасли меня много времени. Это для цикла именно то, что я искал. – Greg

1

Вы называете переменную dotDotSlash с тем же наименованием вашей функции dotDotSlash(). Измените имя этой переменной dotDotSlash = "../" на что-то вроде dotDotSlash_var = "../"

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