• Насколько такой метод проверки является корректным и как его можно сократить?

    @Span4ev Автор вопроса
    Спасибо. Воспользовался вашим примером и всё таки функцией 'all', про которую подсказали в комментах. Но без вашего примера синтаксиса не понимал, как её применить.
    Остановился на таком варианте
    def add_time(self, h=0, m=0, d=0, dw=0, mh=0, y=0):
            
            if all(type(v) == int for v in [h,m,d,dw,mh,y]) and all(v >= 0 for v in [h,m,d,dw,mh,y]):


    За что люблю этот форум, так это за то, что каждый раз узнаёшь что-то новое.
    Впервые это вижу - h: int = 0. Чудесно выглядит. Не знал такой синтаксис. К сожалению, это не работает при передаче строки, а я хотел сделать чтобы при передаче некорректных аргументов не было ошибки, а лишь ничего не происходило и не менялось. Так что остановился на таком варианте.

    Спасибо, вот примерно такое я себе воображал и хотел.

    Что касается последней части про велосипед, то это равносильно тому, что меня ткнули в учебник по метафизике на китайском языке, в предпоследнюю главу и сказали: "объясни". А я ведь False в физике.
  • Насколько такой метод проверки является корректным и как его можно сократить?

    @Span4ev Автор вопроса
    whojoannaami, Красивое. Спасибо. Разбираюсь и ковыряюсь, пытаюсь понять, как это применить )

    Я так понимаю я должен использовать что-то типа:
    x = all(isinstance(time_unit, int) for time_unit in (h, m, d, dw, mh, y))
     y = all(time_unit >= 0 for time_unit in (h, m, d, dw, mh, y))
            
     if x and y:
  • Как получить ссылку на объект по его атрибуту?

    @Span4ev Автор вопроса
    o5a, Спасибо за отзыв. Я всегда стараюсь максимально подробно описывать задачу, чтобы люди точно понимали что именно мне нужно. Изначально описание этого вопроса было раза в 2-2.5 больше со всеми нюансами, но мой вопрос удалили, сославшись на 3.4 и 3.8.
    Убрав "всем привет" (и теперь больше не буду к этому прибегать), я постарался максимально лаконично сформулировать сей вопрос и, видимо, не сумел попасть в золотую середину. Постараюсь исправиться )
  • Как получить ссылку на объект по его атрибуту?

    @Span4ev Автор вопроса
    Моя благодарность. То, что нужно. Спасибо большое
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Vindicar, Да да да, точно, вы правы. Как я проглядел этот момент с порядком действий... Вот же глупо вышло. Я просто балбес. Спасибо, что объяснили и показали где я ошибся. Я уже хотел снова про классы читать и искать, почему там именно такое присвоение. Пожалуй, лучше снова посмотрю лекции Хирьянова про ссылочную модель
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Алан Гибизов, Видите ли, я просто интерпретирую реальные задачи под простые примеры для вопроса, чтобы тем, кто помогает, легче было понять код и разобраться в концепции. Я часто видел вопросы, когда люди вываливают десятки строк текста с уникальными именами переменных (не отражающих, что эта переменная делает), закомментированными строками, короче - просто копировали кучу кода. Смотришь и ничего не понятно.
    Я всегда переписываю реальный код под понятные, минималистичные и простые примеры, но чтобы они отражали концепцию.
    И переменные называю так, чтобы судя по примеру можно было понять, что они и зачем. Возможно поэтому глядя на простоту вопроса может показаться, что что-то является избыточным, ненужным или абсурдным. Или же чего-то не хватает. Или создаётся ощущение, что я хочу отфильтровать пару строк в списке.
    Но я не нагружаю пример вопроса дополнительными методами, условиями и проверками, которые есть в классе. Зачем отвлекать людей которые хотят помочь необходимостью глядеть на что-то лишнее, не относящееся к проблеме. Возможно подход действительно бредовый, но возможно из-за самого примера он кажется таким.

    Кстати, всё это работает, спасибо ещё раз за вашу помощь.

    "придется всякий раз, обращаясь к отсортированному списку, уточнять - соответствует ли он основному?"
    Да, вы правы. Отосплюсь и взгляну на это свежей головой
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Да, кстати, чуть позже до меня дошло, что во избежания лишних строк, я ведь могу делать так

    open_items = [Tomato, Banana, Wine, Salt...........]
    
        for i in open_items :
            ClassName.open_items.append(i)


    Таким образом я и использую append и десятки предметов будут в списке, а не в каждой строке
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Да, скорее всего вы права - фильтрация. Вероятно я напутал в терминологии.
    Для чего:

    Есть какое-то кол-во товаров. Это кол-во товаров меняется, в зависимости от условий и со временем. Эти товары хранятся в списке open_items.
    В self.open_items я кладу какие-то товары или удаляю их. Этот список склонен меняться. Поэтому в конструкторе класса я объявляю его пустым, а наполняю уже вне класса.

    Сами товары на экране отображаются в виде сетки, её нужно наполнить. И само собой по умолчанию в качестве категории стоит "Все", значит нужно отобразить все товары из open_items.
    Но т.к. мне нужна сортировка, то я использую отдельный список - sorted_items. Его в конструкторе я тоже объявляю пустым.
    Он меняется в зависимости от того, какие категории выбраны (одна, несколько или все). Они выбираются с помощью кнопок. Но раз по умолчанию должны отображаться все категории, а для вывода я должен использовать sorted_items, то мне нужно единоразово скопировать содержимое списка open_items в sorted_items, чтобы отобразить на экране.
    На экран выводятся все товары, а дальше уже в зависимости от выбранной категории с кнопки - отфильтрованные.
    Просто я не знал этих особенностей работы конструктора класса. Оказывается, ссылочная модель там работает иначе.

    https://www.online-python.com/UD2AQHZj0y

    Вот пример одинакового принципа ссылок. Результат разный
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Большое вам спасибо за объяснение. В этой конпепции ссылочной модели я не знал, как себя ведут ссылки при изменении атрибута класса. То, что вы объяснили - да, это работает, но в атрибутах класса это работает иначе. Как я понимаю - это из-за специфики работы конструктора класса

    https://www.online-python.com/UD2AQHZj0y

    Оба списка в момент инициализации конструктора класса пусты.
    Я присваиваю "list_2 " ссылку на объект "list_1". Меняю "list_1", но "list_2" по прежнему ссылается на пустой список, потому что в конструкторе класса в момент создания экземпляра класса, "list_1" был пустым. И при изменении "list_1", "list_2" по-прежнему будет ссылаться на пустой "list_1".
    Вне классов поведение другое.

    ### Это к делу отношения не имеет.
    На всякий случай, если интересно, просто добавлю что именно я хотел сделать.
    Мне нужно было при сортировке отобразить все доступные объекты. Эти доступные объекты будут меняться со временем. Они хранятся в списке open_items. Здесь лежат экземпляры класса.
    Но варианты сортировки меняются (1 категория, несколько, или все) и их нужно хранить в другом месте - в списке sorted_items.
    Следовательно, для вывода на экран нужно использовать именно sorted_items. Но так как из-за особенностей логики программы я не могу в конструктор класса сразу передать все доступные объекты, то есть не могу в классе создать self.open_items = [1, 2], то это я делаю вне класса. И само собой self.sorted_items в классе тоже создаётся пустым.
    Так как я использую для вывода sorted_items, а он пустой, то сетка для построения предметов не работает.
    И мне нужно было единоразово скопировать содержимое open_items в sorted_items, чтобы вывести это на экран (все категории по умолчанию). А дальше уже не проблема. sorted_items являлся пустым списком. Вот что я хотел сделать.
    Мне уже показали, как это решить, но на случай, если вам было интересно
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    o5a,
    это изменилось, и open_items стал ссылаться уже на новый объект.
    А sorted_items2 так и остался ссылаться на изначальный пустой список.

    Большое спасибо за подробное объяснение! Теперь я понял, что именно я упустил... Я думал что в питоне постоянно идёт пересвязывание и если 2 объекта ссылаются на 1, то при изменении одного, изменения происходят во всех ссылках...

    @property
        def sorted_items(self):
            return sorted(self.open_items, reverse=True)
    print(item.sorted_items)


    И мы обращаемся не к атрибуту, а к методу, который сортирует исходный список. Отличная идея. Спасибо ещё раз за подробное объяснение
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Если кому-то ещё понадобится, то append я оставил, само собой, но можно и без него. Присвоение делаю через метод вне класса - других путей не придумал

    class Items:
    
        def __init__(self):
            self.open_items         = []
            self.sorted_items       = []
    
        def func(self):
            self.sorted_items = self.open_items.copy()
            
    item = Items()
    item.open_items = ['item 1', 'item 2']
    item.func()
    
    x = item.sorted_items
    print(x)
    # ['item 1', 'item 2']

    В этом случае можно обойтись без append. При дальнейшем изменении исходного списка, sorted_items по-прежнему будет ссылаться на первое изменение, но мне нужно было единоразово получить копию исходного списка для отображения всех объектов
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Извините, никак не могу понять...

    item.open_items = ['item 1', 'item 2']
    x = item.open_items
    print(x)
    ---> ['item 1', 'item 2']


    В классе у меня атрибут - пустой список
    Далее я атрибуту присваиваю каике-то значения - другой список.
    Когда я обращаюсь к атрибуту класса - open_items, я получаю не пустой список, а тот, который я ему присвоил.
    Атрибут же не может ссылаться на сам себя вот здесь

    item.open_items = ['item 1', 'item 2']

    Значит я всё таки перезаписываю атрибут класса - open_items?
    Если обращаясь к item.open_items я получаю не пустой список, а sorted_items является ссылкой на open_items. И даже если бы атрибут open_items ссылался на какой-то объект в памяти, отчего тогда sorted_items не ссылается на тот же объект через open_items?
    Насколько я знаю, пока есть ссылка на объект, сборщик мусора его не удаляет. Как выходит одной ссылкой получить не пустой список, а другой - получить, если всё ссылается на один объект? Тем более я не совсем понимаю, что в данной строке является объектом, на который есть ссылка?

    item.open_items = ['item 1', 'item 2']

    ['item 1', 'item 2'] - на это ссылается open_items ?

    Что касается append, то сначала я так и хотел сделать, но из-за кол-ва объектов для списка решил строки сэкономить, и не писать кучу раз append (там действительно их много, просто пример не отражает), а присвоить новый список (перезаписыть атрибут). Но ваш метод работает, и, думаю, несмотря на все неясности, буду append-ить сколько нужно.
    Спасибо!
  • Почему не копируется список внутри класса?

    @Span4ev Автор вопроса
    Алан Гибизов, Неплохо. Но он сортирует исходный список. В сам список open_items я помещаю экземпляры классы.
    Просто пример упростил.
    У меня сортировка на кнопках, так что каждой кнопкой я передаю какую-то категорию: либо "all" (тогда в список sorted_items попадают все экземпляры классы) либо определённую категорию (тогда в список попадают экземпляры класса, только если их атрибут равен переданной в класс категории от кнопки).
    В одном месте используется список со всеми предметами, в другом - с отсортированными (на вывод), так что мне в любом случае нужен ещё один список, в котором будут храниться какие-то категории.
    А скопировать начальный список мне нужно, чтобы по умолчанию отображать все предметы. Поэтому я и хочу скопировать исходный список open_items. Так как я для отображения использую список sorted_items, а он, зараза, пустой, то у меня ничего не отображается. А нужно отображать именно sorted_items, потому что именно его я и буду менять кнопками, в том и смысл сортировки. Я не могу менять исходный список open_items и отображать его объекты.
    Пытался методом присвоить одному списку другой и не вышло.
    не понимаю, почему это не работает, даже если я методом принудительно делаю присвоение...

    Наверное я так упростил пример, что люди смотрят и проходят мимо, думая, что задача тривиальная и мне нужно отсортировать "item 1", "item 2"... )
  • Как рандомно расположить объекты без пересечений?

    @Span4ev Автор вопроса
    Не думаю, что это подойдёт. Судя по тому как я понимаю "Оптимальный раскрой" - это позиционирование элементов т.о., чтобы получить:
    1. Наименьшую потерю материала
    2. Наибольшее кол-во элементов из одной единицы материала
    То есть это расположение элементов вплотную так, чтобы побольше вместилось.
    В этом случае напрочь исключён фактор случайного расположения элементов, так что не сгодится.
    Чтобы сделать "Оптимальный раскрой" из объектов квадратной формы - достаточно просто к каждой новой икс координате добавлять ширину объекта, и добавлять высоту для игрек при переходе на новый ряд
  • Как рандомно расположить объекты без пересечений?

    @Span4ev Автор вопроса
    Алан Гибизов, всё это будет выводиться единоразово, меняться ничего не будет. Просто расположить элементы случайным образом.
    Вообще я удивлён и смущён тем фактом, что это оказалось не так просто, как я предполагал.
    Вы привели в пример готовые методы внутри игровых движков. Отлично, значит внутри этих методов описаны некие алгоритмы. Значит всё это решаемо, и не из области недостижимого.
    Так как я не знаю математику и у меня плохо с соображалкой (но к счастью большинство знает как и её, так и пайтон), то я предположил, что подобный алгоритм является чуть ли не чем-то насущным, с чем каждый программист рано или поздно сталкивается во время своей практики. Ведь подобная идея вряд ли из разряда "хм... никогда об этом не задумывался", а скорее из - "да, я как-то делал такое. И не раз".
    Расположение элементов в случайных координатах без пересечений - я думал это просто для знающих и давно пройденный этап. Я тут пока сидел подумал, что правильно будет делать что-то подобное

    if not coors:
        coors.append(temp)
    else:
    
        for k in coors:
    
            temp_x = k[0] + width  
            temp_y = k[1] + height 
    
            if rand_x > k[0] or rand_x < temp_x:
                rand_x = rand_x
            else:
                rand_x += width
    
            if rand_y > k[1] or rand_y < temp_y:
                rand_y = rand_y
            else:
                rand_y += height
    
            temp  = (rand_x, rand_y)
        coors.append(temp)


    то есть я запускаю цикл и прохожусь ко кортежам (x, y) в списке
    я завожу новую переменную, в которой будет храниться (x, y) + ширина и высота. Тем самым я определяю диапазон от начальной координаты объекта до последней
    затем сверяю
    если новое значение random больше или меньше первого числа в кортеже, то значит оно не пересекается.
    Значит оно мне подходит.
    Если оно не больши или не меньше, значит оно пересекается, и я добавляю к нему ширину или высоту.
    Мне кажется такая концепция ближе к истине

    Не удивлюсь, если потревоженный и недовольный модер удалит этот ответ
  • Как рандомно расположить объекты без пересечений?

    @Span4ev Автор вопроса
    Только я работаю не в пайгейме, а в renpy. Пайгейм привёл как пример, потому что и там и там - питон и пайгейм здесь больше людей знает, чем ренпай. Да, в своё время, когда я пытался реализовать это в пайгейме - ваш совет действительно помог бы мне, но сейчас, увы.
    colliderect(Rect) не имею.
    Но каков сам алгоритм такого позиционирования? Это же должно как-то высчитываться математически.
    Просто - ссылаться на документацию - это последнее, что действительно может помочь... Так на любой вопрос на этом форуме можно ответить - читайте документацию того или иного.
    Вы знаете сам алгоритм? Вы сможете это реализовать без встроенных функций? Просто не понимаю, почему наша беседа из комментариев перешла в ответ на вопрос. На данный момент раз уже вы знаете, что речь идёт о Renpy, то если вы не можете привести в пример алгоритм или сослаться на уже готовый пример в интернете, или же описать основную концепцию или хотя бы сослаться на метод из документации Renpy, то не будете ли вы так любезны удалить ваш ответ, который мне ничуть не помогает? Просто без ответов на вопрос больше шансов получить что-то дельное.
    Благодарю за понимание
  • Как рандомно расположить объекты без пересечений?

    @Span4ev Автор вопроса
    Алан Гибизов, Конечно, вы правы, прошу прощения.
    Если вы знакомы с Пайгейм, то на его примере. Если нет, то представьте любой игровой движок.

    Под объектами я имею ввиду что угодно, хоть прямоугольники, хоть изображения. У них есть высота и ширина. Я хочу расположить эти - пусть будут - картинки в случайных местах экранного пространства, но так, чтобы их границы не пересекались друг с другом. В моём случае я имею наложение объектов друг на друга в некоторых местах в разных ситуациях, потому что (просто пример)

    ширина изображения = 100 пикселей
    высота изображения = 100 пикселей

    1 объект:
    случайно полученная икс координата = 0
    случайно полученная игрек координата = 0
    Занимает от 0 до 100 по x и y

    2 объект:
    случайно полученная икс координата = 22
    случайно полученная игрек координата = 33
    Занимает от 22 до 122 по x и от 33 до 133 по y

    В итоге объект 2 заходит в границы объекта 1 и частично его закрывает. Нужно чтобы объект 2 учитывал расположение объекта 1 и его начальные координаты были дальше чем координаты объекта 1, то есть
    " Объект 1 Занимает от 0 до 100 по x и y"
    Чтобы объект 2 как минимум располагался дальше
    x от 0 до 100
    y от 0 до 100

    Пример на основе двух объектов. Объектов несколько. Но условимся, все объекты могут свободно уместиться на экранном пространстве.
  • Как добавить нули перед целыми числами?

    @Span4ev Автор вопроса
    Wispik, Это понятно, там это и не сработает, т.к. консоли там нет. Как и ваш подход в моём случае
  • Как добавить нули перед целыми числами?

    @Span4ev Автор вопроса
    Такой синтаксис не прокатит.
    # invalid format specifier
    Здесь у вас питоновский print, но я писал, что вывод не совсем питоновский. Это нужно сделать до вывода
  • Знаете ли вы генератор цветов формата ff000000?

    @Span4ev Автор вопроса
    mayton2019, mayton2019, я ничего не хотел автоматизировать. Мне нужны были примеры прозрачного цвета, которые я, к своему удивлению, не нашёл, как ожидал. Поиски кругов навели на обычные круги, без прозрачности.
    Но я уже прочитал (причём случайно), что за прозрачность отвечают не первые 2 символа, как вы писали, а последние.
    В чём проблема с прозрачность? Нужно просто добавить в начале значение прозрачности из двух символов


    Теперь всё стало очень просто и понятно
    #000000 - чёрный
    #00000050 - 50% прозрачности чёрного