@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
  • Вопрос задан
  • 1481 просмотр
Решения вопроса 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__?
А что, черт возьми, вы хотели этим сказать в своей программе?
На лицо не понимание кода. Вам слеует немного поучить основы питона.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
06 мая 2024, в 09:38
1200 руб./в час
06 мая 2024, в 09:37
1200 руб./в час
06 мая 2024, в 09:36
8000 руб./за проект