Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52

Контекстный менеджер

06.02.2023, 12:56. Показов 1867. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Помогите, пожалуйста исправить код к требованию преподавателя.
Заранее спасибо!

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
 
 
    def __enter__(self):
        self.file = open(self.filename, self.mode) # Сюда добавил режим чтения
        return self.file
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
 
with File('example.txt', 'w+') as file:
    file.write('Всем привет')
Требование преподавателя:
Согласно условию задачи, контекстный менеджер:

при попытке открыть несуществующий файл менеджер автоматически создаёт и открывает этот файл в режиме записи
на выходе из менеджера подавляются все исключения, связанные с файлами.


Файл открывается в методе __enter__ и в нем нужно сделать проверки есть ли такой файл - если нет открыть его в режиме записи.
Выход из менеджера осуществляется в методе __exit__, а все исключения связанные с файлами это IOError. Значит нужно сделать проверку, что текущая ошибка это IOError либо ее подкласс с помощью issubclass и в этом случае вернуть True
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.02.2023, 12:56
Ответы с готовыми решениями:

Контекстный менеджер с классом
Здравствуйте, киберфорумцы. Я бы хотел сделать, чтобы внутри контекстного менеджера были доступны классы/функции. Я пробовал, добавить в...

Контекстный менеджер для коннекта к RabbitMQ
Пытаюсь реализовать свой контекстный менеджер через либу pika import pika class RabbitConnection: def __init__(self,...

требуется младший менеджер(1700$)/менеджер проекта(2400$) Visual Basic 6
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify <SPAN style="FONT-SIZE: 14pt <FONT color=#000000><FONT face="Times New...

16
 Аватар для rim41
1045 / 313 / 78
Регистрация: 16.03.2020
Сообщений: 954
06.02.2023, 13:02
micha1994, В чем проблема?
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
06.02.2023, 13:05  [ТС]
Цитата Сообщение от rim41 Посмотреть сообщение
micha1994, В чем проблема?
Совсем не понимаю как это сделать:
Значит нужно сделать проверку, что текущая ошибка это IOError либо ее подкласс с помощью issubclass и в этом случае вернуть True
0
 Аватар для rim41
1045 / 313 / 78
Регистрация: 16.03.2020
Сообщений: 954
06.02.2023, 13:09
micha1994,
Python
1
2
3
4
5
6
...
try:
    ...
except Exception as e:
    if issubclass(e, IOError):
        return True
Добавлено через 1 минуту
Цитата Сообщение от micha1994 Посмотреть сообщение
Совсем не понимаю
Окей гугл как проверить какая ошибка в исключении в пайтон
1
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
06.02.2023, 14:20  [ТС]
Цитата Сообщение от rim41 Посмотреть сообщение
1
2
3
4
5
6
...
try:
    ...
except Exception as e:
    if issubclass(e, IOError):
        return True
А вот так норм будет?
Попробовал по аналогии из гугла, вот только не знаю будет ли это решением?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
 
 
    def __enter__(self):
        self.file = open(self.filename, self.mode) # Сюда добавил режим чтения
        return self.file
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        if exc_type and issubclass(exc_type, IOError): 
            return True
 
with File('example.txt', 'w+') as file:
    file.write('Всем привет')
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
08.02.2023, 14:31  [ТС]
Подскажите, пожалуйста , как в __enter__ добавить проверку на существование файла, чтобы открыть его в режиме записи.(требование преподавателя)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
 
 
    def __enter__(self):
        self.file = open(self.filename, self.mode) # Сюда добавил режим чтения
        return self.file
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        if exc_type and issubclass(exc_type, IOError): 
            return True
 
with File('example.txt', 'w+') as file:
    file.write('Всем привет')
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
08.02.2023, 15:33
micha1994, загуглить функцию isexist(file)
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
08.02.2023, 15:45  [ТС]
Дополнил код.
Ошибки вроде не выдает, но когда файла нет не выдает False.
Прошу проверить и подсказать если что.
Заранее спасибо!

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os.path
 
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
 
 
    def __enter__(self):
        self.file = open(self.filename, self.mode) # Сюда добавил режим чтения
        return self.file
        file_exists = os.path.exists('example.txt')
        print(file_exists)
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        if exc_type and issubclass(exc_type, IOError): 
            return True
 
with File('example.txt', 'w+') as file:
    file.write('Всем привет')
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
08.02.2023, 16:23
Цитата Сообщение от micha1994 Посмотреть сообщение
return self.file
file_exists = os.path.exists('example.txt')
а разве после операции ретурн код может выполниться? и к тому же зачем ты конкретное значение файлу задаешь? юзер же его задает через селф.файлнейм
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
08.02.2023, 17:30  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
а разве после операции ретурн код может выполниться? и к тому же зачем ты конкретное значение файлу задаешь? юзер же его задает через селф.файлнейм
Можешь тогда, пожалуйста, подсказать, как надо?
Вот так нормально будет?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os.path
file_exists = os.path.exists('example.txt')
print(file_exists)
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
 
 
    def __enter__(self):
        
        self.file = open(self.filename, self.mode) # Сюда добавил режим чтения  
        return self.file
  
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        if exc_type and issubclass(exc_type, IOError): 
            return True
 
with File('example.txt', 'w+') as file:
    file.write('Всем привет')
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
08.02.2023, 18:10
Лучший ответ Сообщение было отмечено micha1994 как решение

Решение

Было же нормально, зачем ты код из класса вытащил?
1
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
08.02.2023, 18:57  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Было же нормально, зачем ты код из класса вытащил?
Да проблема в том что когда файла нету, он не выдал False.
Вот не знаю как сделать в коде это.
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
09.02.2023, 23:01  [ТС]
Как дописать код под требование:
Заранее спасибо!
В конце следует добавить проверку на наличие файла, и при ее выполнении подключится к переданному протоколу. В ином случае доступ к файлу в протоколе записи. Например, через os.listdir
Code
1
2
3
4
5
6
def __enter__(self):
    if self.file_name not in os.listdir():
        self.mode = ...
 
    self.file = open(...
    return self.file



Основной код

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
 
 
    def __enter__(self):
        if self.file_name not in os.listdir():
            self.mode = ...
 
        self.file = open(self.filename, self.mode)
        return self.file
  
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        if exc_type and issubclass(exc_type, IOError): 
            return True
 
with File('example.txt', 'w+') as file:
    file.write('Всем привет')
 
def __enter__(self):
    if self.file_name not in os.listdir('example.txt'):
        self.mode = ...
 
    self.file = open(self.filename, self.mode)
    return self.file
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
10.02.2023, 15:37
Ты хоть понимаешь написанный код?
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
11.02.2023, 18:13  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Ты хоть понимаешь написанный код?
Ну так, с трудом
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
11.02.2023, 18:14
Уберите вторую функцию __enter__, и всё будет ок.
0
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 52
11.02.2023, 18:16  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Уберите вторую функцию __enter__, и всё будет ок.
Да там ещё проверку надо было в ентер добавить, вот так вышло в финале и зачли:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class OpenFile:
    def __init__(self, file_name, mode):
        self.file_name = file_name
        self.mode = mode
 
    def __enter__(self):
        try:
            self.file = open(self.file_name, self.mode)
        except FileNotFoundError:
            self.file = open(self.file_name, 'w')
        return self.file
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type and issubclass(exc_type, IOError):
            return True
        self.file.close()
 
with OpenFile('file.txt', 'r') as f:
    f.write('Всем привет')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2023, 18:16
Помогаю со студенческими работами здесь

Нужен Менеджер по работе с сайтом / Контент-менеджер / Редактор сайта
Все привет. Нужен человек для работы в офисе 5\2 (удаленно и плавающие графики не рассматриваю) Офис метро Котельники 2-й Покровский...

Менеджер по продажам / Менеджер по работе с клиентами (удаленно) от 12 000
Работодатель "СТИЛЬ ПЛЮС ООО" (Москва) предлагает вакансию на должность Менеджер по продажам / Менеджер по работе с клиентами (удаленно). ...

Крупной сети гипермаркетов требуется младший менеджер(1700$)/менеджер проекта(2400$) Visual Basic 6.
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify <SPAN style="FONT-SIZE: 14pt <FONT color=#000000><FONT face="Times New...

Контекстный подсказчик в QT
Как сделать чтобы контекстный подсказчик вызывался после первых введённых символов, а не после CTRL + SPACE ?

Контекстный поиск в Memo
вопрос такой, есть большая Таблица (больше гига), есть в ней поле типа memo, в нем текст(набор слов, раззделенных ;). Нужно сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью, разработанный в конфигурации КА2. Данные берутся из регистра. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru