98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594

Контейнер на Замыкании

28.12.2023, 19:40. Показов 615. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
- Всем доброго времени суток!
- Мой вопрос адресован знающим Замыкания и работу с Типами Данных.
Сделал себе Контейнер на основе Замыкания (см. пример ниже). Многое подсмотрел в Роликах:
Python
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def Cont_closure(el_type: type, size: int = 1):  # Контейнер (замыкание)
    # (собственно Контейнер (заданных Типа и Размера))
    cont_closure = [el_type() for _ in range(size)]
 
    def inner(value: el_type, ind: int = 0):  # внутренняя ф-ция
        # (проверка Индекса)
        if ind < 0 or ind >= size:
            print('Ошибка - Неверный Индекс контейнера!')
        # ------------------------------------
        # (занесение)
        cont_closure[ind] = el_type(value)
        # ------------------------------------
 
    return inner
 
 
# =====Container]====================================================================
class Container:  # класс - Контейнер (обертка замыкания)
    def __init__(self, el_type: type = int, size: int = 1):
        # (Элемент Контейнера)
        self.el_type = el_type  # Тип
        self.size = size  # Число
        # ----------------------------------------------
        # (экземпляр Замыкания)
        self.clos = Cont_closure(self.el_type, size)
        # ----------------------------------------------
 
    # ==== ((( Установка и Получение )))======================================================
    def set_cont(self, value, ind: int = 0):  # установить - Значение (по Индексу)
        self.clos(self.el_type(value), ind)
 
    def get_cont(self, ind: int = 0) -> type:  # получить - Значение (по Индексу)
        return self.clos.__closure__[0].cell_contents[ind]  # (параметры: - type (0), - size (1))
 
    # ==== ((( Инкремент и Декремент )))======================================================
    def incr_cont(self):  # Увеличить текущее Значение
        val = self.get_cont()
        self.set_cont(val + 1)  # (val - подсвечивает !!!)
 
    def decr_cont(self):  # Уменьшить текущее Значение
        val = self.get_cont()
        self.set_cont(val - 1)  # (val - подсвечивает !!!)
- Все работает прекрасно. Однако, PyCharm подсвечивает Аргументы-'val' в двух местах указанных Комментариями!
Может я делаю что-то НЕ ТАК? Или может быть Вы сделали бы все это ПО-ДРУГОМУ. Тогда КАК и ПОЧЕМУ ?

- Заранее Всем Благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2023, 19:40
Ответы с готовыми решениями:

Переменные в замыкании
В этом коде переменная abc увеличивается при каждом вызове v(); var v = Met1(11); Console.WriteLine ( v(22).Invoke(33) ); ...

Найти среднее арифметическое и добавить его в контейнер (контейнер map), тип элементов int
помогите пожалуйста, завтра надо сдавать, скину денег если шо

Заменить контейнер vector, использовавшийся для хранения текстовых строк (листинг 2.3), на контейнер list
Здравствуйте форумчане, может кто объяснить как делать это задание и что собственно мы тут вообще делаем. сам листинг 2.3 ниже ...

10
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
29.12.2023, 00:12
Staut, У подсветки должна быть какая то подсказка. Скрин в студию
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
29.12.2023, 08:22
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Дык задекларировал, что get_cont() возвращает type, а где ругается - пытаешься этот type сложить с int.
Вот и все
3
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
29.12.2023, 09:00
Цитата Сообщение от Staut Посмотреть сообщение
Может я делаю что-то НЕ ТАК?
а вы расскажите что вы делаете. В чем выгода вот этой мудреной логики, зачем использовали тут замыкание?
1
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
29.12.2023, 11:33  [ТС]
- iSmokeJC, спасибо! Работать с Типами в Python еще НЕ УМЕЮ. Правил ПРАВИЛЬНОГО обхода всех сложностей
пока не знаю. Ведь не могу же я сделать так:
Python
1
2
    def get_cont(self, ind: int = 0) -> self.el_type:  # получить - Значение (по Индексу)
        return self.clos.__closure__[0].cell_contents[ind]  # (параметры: - type (0), - size (1))
Python не пропустит -> self.el_type:
- А как тогда делать ПРАВИЛЬНО?

- Welemir1, в моем приложении приходится иметь дело с всего несколькими Глобальными переменными.
Они как бы над несколькими другими Модулями. Нужно быть уверенным в Значениях этих переменных и их ИЗМЕНЕНИИ.
Оформил эти Глобальные переменные в виде Контейнеров и обращаюсь к ним из НЕСКОЛЬКИХ своих Модулей.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
29.12.2023, 11:36
Я ровным счетом ничего не понял, посему откланиваюсь
2
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
29.12.2023, 11:59  [ТС]
- iSmokeJC. Я имел в виду то, что в Методе get_cont() в Аннотации Возвращаемого Значения
ПРАВИЛЬНЕЕ было бы написать: -> self.el_type: Но интерпретатор Python по каким-то своим причинам
этого НЕ ДОПУСКАЕТ!
- Спасибо Вам за участие.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
29.12.2023, 12:26
Лучший ответ Сообщение было отмечено Staut как решение

Решение

Цитата Сообщение от Staut Посмотреть сообщение
ПРАВИЛЬНЕЕ было бы написать: -> self.el_type
Ни разу не правильнее. Декларируется возвращаемый ТИП, а не какая-то переменная.

Добавлено через 5 минут
Я кажись понял глубинную идею этого кода.
Мсье знает толк в извращениях...

По сабжу - убери вообще эту декларацию возвращаемого типа, ведь тип не определен

Добавлено через 2 минуты
Цитата Сообщение от Welemir1 Посмотреть сообщение
а вы расскажите что вы делаете
ТС пытался замутить нечто подобное Optional из джавы. Но способ такой себе

Добавлено через 12 минут
Цитата Сообщение от Staut Посмотреть сообщение
def incr_cont(self):  # Увеличить текущее Значение
Если твой класс позиционируется как хранилище значения любого типа, то каким боком тут инкремент/декремент? Каким образом ты например будешь делать инкремент строке? Или кортежу? Или еще чему-нибудь кроме int и float?
2
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
29.12.2023, 12:43  [ТС]
- Да я вроде бы и сам допер! У меня сейчас в Коде:
Python
1
2
3
4
5
6
7
8
9
    def get_cont(self, ind: int = 0):  # получить - Значение (по Индексу)
        return self.clos.__closure__[0].cell_contents[ind]  # (параметры: - type (0), - size (1))
    ...
    def incr_cont(self):  # Увеличить текущее Значение
        if self.el_type == int | float:
            val = self.get_cont()
            self.set_cont(val + 1)  # (НЕ подсвечивает !!!)
        else:
            raise TypeError(f'Попытка инкрементировать Тип {self.el_type}!')
- Сейчас ничто не подсвечивается и работает правильно. Просто я думал, что есть какие-то
"более ПРАВИЛЬНОЕ" указание в Аннотации Выходного Значения или еще "что-то".
Просто ПЛОХО знаю работу с Аннотациями и Типами Данных. Учусь ...
- Спасибо за указания!
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,688
Записей в блоге: 29
29.12.2023, 13:08
Цитата Сообщение от Staut Посмотреть сообщение
Нужно быть уверенным в Значениях этих переменных и их ИЗМЕНЕНИИ.
в питоне это невозможно, даже в замыкание (как и написано в коде) можно легко залезть и все поменять. Потому мы в питоне этим не занимаемся - не закрываем доступы, не вешаем амбарные замки, просто вешаем знак "Внимание" при помощи нижнего подчеркивания. Для взрослых пользователей твоего кода этого будет достаточно. Потому я бы все это переписал на обычный класс без всяких замыканий.
2
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
29.12.2023, 19:16  [ТС]
- Да Welemir1, Спасибо! Слышал я и о "невозможности защитить", и о "нижнем подчеркивании".
Только пока никак не приноровлюсь сам. Видимо пока эти знания "шаткие". Нужно больше писать и пробовать.
Этим и занимаюсь ... Еще раз Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2023, 19:16
Помогаю со студенческими работами здесь

о замыкании базы на землю
Приветствую форумчане! Вот, ваяю схемку, схемка управляет ногой контроллера, на ноге всегда должна быть единица, а при нажатии кнопки...

Доказательство теоремы о транзитивном замыкании
Добрый день! Помогите пожалуйста понять доказательство: ...

Переделать контейнер-очередь в контейнер-стек
Переделать контейнер-очередь в контейнер-стек Есть 2а файла: TQUEUE.H: #ifndef TQUEUE_H #define TQUEUE_H #include...

АЦП выдаёт не 0 при замыкании на землю
Здравствуйте. Хотел подключить пару кнопок через ацп на attiny13 и заметил некоторые странности в работе. Для проверки взял arduino uno на...

Расчет сопротивления при коротком замыкании
Нужно рассчитать сопротивление на зажимах 1 и 1' в случае короткого замыкания. Понятно,что мы закорачиваем точки 2 и 2' , то есть соединяем...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru