def requires_token(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs): #оборачиваем метод, а не функцию
try:
result = func(self, *args, **kwargs) # пробуем вызвать метод как есть
except InvalidToken: # кастомное исключение, которое должны выбрасывать методы
self._acquire_new_token() # получаем новый токен
result = func(self, *args, **kwargs) # пробуем еще раз
return result
return wrapper
OSError: dlopen(opus, 0x0006): tried: 'opus' (no such file), '/usr/local/lib/opus' (no such file), '/usr/lib/opus' (no such file), '/Users/similization/Programming/python/discord_bot/opus' (no such file)
c
в строке построй список вида [c.upper(), c.lower()]
, если это буква. Если не буква, список должен содержать один элемент.[['a', 'A'], ['.'], ['b', 'B'], ['c', 'C'], ['@'], ['d', 'D']]
itertools.product(*patterns)
и итерируешься по тому, что оно вернёт. all_lessons = []
, куда будем складывать результат.for lesson in data:
можно будет перебрать уроки.[
[['6']], # индекс 0 - номер урока (почему-то в двух списках)
[], #индекс 1 - понедельник
[['Физкультура'], ['Храпов О.Е.'], ['12:05 - 12:45'], ['216']], #индекс 2 - вторник
[['Иностранный ...'], ['Севостьянова Е....'], ['12:05 - 12:45'], ['047']], #индекс 3 - среда
[['Физкультура'], ['Храпов О.Е.'], ['12:05 - 12:45'], ['216']], #индекс 4 - четверг
[], #индекс 5 - пятница
[], #индекс 6 - суббота?
[], #индекс 7 - ?
[] #индекс 8 - ?
],
lesson[0][0]
.for day_number in range(1, 7): #1 - понедельник
lesson_per_day = lesson[day_number]
[
['Технология'], #0 - что
['Бирюкова Е.Н.'], # 1 - кто
['16:15 - 16:55'], # 2 - когда
['133'], # 3 - где
['Технология'], #4 - что (альтернатива)
['Горбунова Е.П.'], # 5 - кто (альтернатива)
['16:15 - 16:55'], # 6 - когда (альтернатива)
['048'] # 7 - где (альтернатива)
]
if len(lesson_per_day) == 4: # есть одно занятие?
all_lessons.append({
'number': int(lesson[0][0]),
'day': day_number,
'subject': lesson_per_day[0],
'teacher': lesson_per_day[1],
'time': lesson_per_day[2],
'room': lesson_per_day[3],
'type': '' # занятие не над/под чертой
})
elif len(lesson_per_day) == 8: # есть два занятия?
all_lessons.append({
'number': int(lesson[0][0]),
'day': day_number,
'subject': lesson_per_day[0],
'teacher': lesson_per_day[1],
'time': lesson_per_day[2],
'room': lesson_per_day[3],
'type': 'над чертой'
})
all_lessons.append({
'number': int(lesson[0][0]),
'day': day_number,
'subject': lesson_per_day[4],
'teacher': lesson_per_day[5],
'time': lesson_per_day[6],
'room': lesson_per_day[7],
'type': 'под чертой'
})
[
{'number': 6, 'daynumber': 1, 'subject': 'Физкультура', 'teacher': 'Храпов О.Е.', 'time': '12:05 - 12:45', 'room': '216', type: ''},
{..................},
.....................
]
# -*- coding: windows-1251 -*-
#сначала реализуем механизм, который позволяет получать объект дневник для пользователя
import typing
from functools import lru_cache
# говорим, что результаты вызова функции должны кэшироваться,
# но храниться в кэше должно не более 50 экземпляров класса Dnevnik
# при появлении новых экземпляров, самые старые будут выкинуты
@lru_cache(maxsize=50)
# принимаем ID пользователя Telegram, возвращаем или объект Dnevnik, или None
def get_user_dnevnik(user_id) -> typing.Optional[Dnevnik]:
# получаешь новый курсор для своего соединения с БД
# я фз как у тебя называется глобальная переменная, хранящая соединение,
# так что назвал её db_conn. Поправишь
cursor = db_conn.cursor()
# выбираем из таблицы логинов/паролей пару, соответствующую указанному пользователю
# имена таблицы и столбцов опять таки поправь, я не помню как они у тебя называются
cursor.execute("SELECT loginD, passwordD FROM users WHERE id = ?", (user_id,))
row = cursor.fetchone()
if row is None: # нет такого пользователя, возвращаем None
return None
# в запросе порядок столбцов сначала логин, потом пароль, так что row = (логин, пароль)
return Dnevnik(login=row[0], password=row[1]) # возвращаем объект Dnevnik
from html.parser import HTMLParser
bufer = '''<p>
<div>hi!
</p>'''
class MyHTMLParser(HTMLParser):
def __init__(self):
super().__init__()
self.open_tags = []
def handle_starttag(self, tag, attrs):
print("Start tag:", tag)
self.open_tags.append((tag, self.getpos()))
def handle_endtag(self, tag):
print("End tag :", tag)
unclosed_tags = []
# ищем, когда был открыт нужный тег
for i in range(len(self.open_tags)-1, -1, -1):
if self.open_tags[i][0] != tag:
unclosed_tags.append(self.open_tags[i])
else:
break
if len(unclosed_tags) == len(self.open_tags): # тег никогда и не был открыт
print(f"Closing tag {tag} has no matching opening tag!")
elif unclosed_tags: # тег был открыт, но он не последний
print("Following tags are not closed properly:\n", '\n'.join(f' {t} at line {line} pos {col+1}' for t,(line, col) in unclosed_tags))
del self.open_tags[-len(unclosed_tags)+1:] # сбрасываем незакрытые теги
else: # тег был открыт, и он последний - всё в порядке
del self.open_tags[-1]
def close(self):
super().close()
print('Processing done')
parser = MyHTMLParser()
parser.feed(bufer)
parser.close()
for row in records:
loginD = row[2]
passwordD = row[3]
d = Dnevnik(login=loginD, password=passwordD)