@DoILookLikeASubscriber

Не создается срез в python. Ошибка TypeError?

Здраствуйте, разрабатываю приложение для обработки сообщений. Необходимо выбирать данные из общего сообщения. Пытаюсь решить проблему со срезом. Создаю переменные 1 границы и 2 границы. Переменная с данными создается срезом. Границы среза те переменные границ. Получаю ошибку TypeError: slice indices must be integers or None or have an __index__ method. Заранее спасибо.
name = ''
code = ''
location1 = ''
location2 = ''
status1 = ''
status2 = ''
date = ''
time = ''
downtime = ''
day = ''
hour =''
minute = ''
# Объявление границ
downtime_border1 = ''
downtime_border2 = ''
full_downtime = ''
def template(string):
    name_border1 = 7
    name_border2 = string.find(' к', name_border1)
    code_border1 = string.find('д', name_border2)+2
    code_border2 = string.find(' ', code_border1)
    location_border11 = code_border2+1
    location_border21 = string.find(' не', location_border11)
    location_border22 = string.find(' вновь', location_border11)
    status_border11 = location_border21+1
    status_border12 = location_border22+1
    status_border2 = string.find(' с ')
    date_border1 = status_border2+3
    date_border2 = string.find(' ', date_border1)
    time_border1 = date_border2+1
    time_border2 = string.find(' МСК', time_border1)
# Присваивание значения 1 границе
    downtime_border1 = string.find('дн', time_border2)-2
# 2 границе
    downtime_border2 = string.rfind('.', downtime_border1)
    
    name = string[name_border1:name_border2]
    code = string[code_border1:code_border2]
    location1 = string[location_border11:location_border21]
    location2 = string[location_border11:location_border22]
    status1 = string[status_border11:status_border2]
    status2 = string[status_border12:status_border2]
def losed(string):
    day_border1 = string.rfind('л')+2
    day_border2 = string.find(' дн', day_border1)
    hour_border1 = day_border2+2
    hour_border2 = string.find(',', hour_border1)
    minute_border1 = hour_border2+2
    minute_border2 = len(string)-1
# В full_downtime вылезает Traceback
# Имя ошибки TypeError: slice indices must be integers or None or have an __index__ method
    full_downtime = string[downtime_border1:downtime_border2]
    day = string[day_border1:day_border2]
    hour = string[hour_border1:hour_border2]
    minute = string[minute_border1:minute_border2]


Traceback:
File "/home/gidromet_user/Документы/Pyhandler/Template.py", line 51, in losed
    full_downtime = string[downtime_border1:downtime_border2]
TypeError: slice indices must be integers or None or have an __index__ method
  • Вопрос задан
  • 2025 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Потому что ты не разбираешься в областях видимости переменных.
У тебя описаны глобальные переменные:
downtime_border1 = ''  # строка!
downtime_border2 = '' # строка!

А ты делаешь присваивание локальным переменным
# Присваивание значения 1 границе
    downtime_border1 = string.find('дн', time_border2)-2
# 2 границе
    downtime_border2 = string.rfind('.', downtime_border1)

Это никак не затронет глобальные переменные с тем же именем, а только "заслонит" их внутри функции. Читай про ключевое слово global.
А лучше - переделай код так, чтобы не использовать глобальные переменные вообще. Используй возвращаемые значения.
А ещё лучше - перепиши код так, чтобы передавать минимум данных. Например, тебе точно нужны отдельные функции template() и losed()? Их нельзя объединить в одну?

А совсем хорошо - освой регулярные выражения. Это здорово упростит решаемую тобой задачу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Давайте я помогу перевести этот текст для вас:
TypeError: slice indices must be integers or None or have an __index__ method

- Ошибка Типов: индексы среза должны быть целочисленными значениями или None или должны поддерживать метод __index__.
Теперь посмотрите внимательно на строку, где произошла ошибка:
full_downtime = string[downtime_border1:downtime_border2]

Где же у вас тут индексы среза?
-- Вот они: downtime_border1 и downtime_border2
Давайте посмотрим какие значения у вас могут принимать эти переменные:
downtime_border1 = ''
downtime_border2 = ''

Неожиданно!
Что это а тип? Это целые числа? - нет
Это None? - Нет!
У них есть метод __index__?
А что, черт возьми, вы хотели этим сказать в своей программе?
На лицо не понимание кода. Вам слеует немного поучить основы питона.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы