@cehka

Почему при рекурсии переменная ведёт себя так?

import webbrowser
import vk_api
from os.path import isfile

def start():
    fileName = ""
    lastSymbols = ""
    vk = [] # Массив с API аккаунтов. В каждой функции нужно for item in vk .
    fileName = input(PREFIX + Fore.WHITE + 'Введите название файла со списком аккаунтов[accounts.txt]: ')

    if not fileName:
        fileName = 'accounts.txt'

    if len(fileName) < 4:
        print(PREFIX + Fore.RED + "Неправильное название файла.")
        main()

    lastSymbols = fileName[-4] + fileName[-3] + fileName[-2] + fileName[-1]
    if lastSymbols != '.txt':
        fileName = fileName + ".txt"
        if isfile(fileName):
            pass
        else:
            # print(PREFIX + Fore.RED + "Файл должен быть расширения .txt")
            error_message("Файл должен быть расширения .txt")
            start()
    fileName = fileName
    print(fileName)
    with open(fileName, 'r') as f:
        lines = f.readlines()


def main():
    start()

if __name__ == '__main__':
    init()
    main()


Вот собственно часть кода. Проблема вот в чём:
Запускают файл, ввожу рандомный текст(Например: aaaaaaaa), по ясным причинам говорит, что файл не существует. В коде после этого принта идёт start(), то есть рекурсия. И вот, мне нужно опять вводить название файла. Нажимаю enter(по дефолту стоит СУЩЕСТВУЮЩИЙ файл), файл нормально читается - но дальше следует ошибка, что в строчке создания переменной lastSymbols индекс привышает возможный, хотя текст - 'accounts.txt'. Как я понимаю, он берёт данные из старой переменной, которая была при первом заходу, но я не понимаю почему. Как исправить, и почему так происходит?
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
h0w4rd
@h0w4rd
Python dev.
После вызова main() нет "return", поэтому код продолжает выполняться.
Где нужно еще раз вызвать эту же функцию (например при неправильном вводе) ОБЯЗАТЕЛЬНО нужен "return", например так: return ИмяФункции().

UPD:
Я про:
if len(fileName) < 4:
        print(PREFIX + Fore.RED + "Неправильное название файла.")
        main()

И лучше вызывать как "start()", ведь "main()" вызывает "start()". А это небольшая, но задержка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы