• Как реализовать базовый класс для динамического создания подклассов без вызова рекурсии в Python?

    Vindicar
    @Vindicar
    RTFM!
    Пусть родительский класс имеет классовую переменную, храняющую список известных классов потомков и ассоциированные с ними данные.
    Потомки должны будут регистрировать себя в этой коллекции - либо явно (через метод или декоратор), либо неявно, через метакласс. Тогда родительский класс будет перебирать эту коллекцию в поисках "подходящего" класса-потомка и создавать его.

    Пример:
    class Parent:
        known_children = []  # список классов-потомков Parent
        @staticmethod
        def register(klass):  # декоратор для регистрации классов-потомков
            Parent.known_children.append(klass)
            return klass
        @classmethod
        def can_handle(cls, data):  # "эй, потомок, ты можешь себя создать из этих данных?"
            raise NotImplementedError()
        @staticmethod
        def make(data):  # создаёт экземпляр одного из потомков
            for child in Parent.known_children:
                if child.can_handle(data):  # потомок согласился обработать данные?
                    return child(data)  # вызываем конструктор класса-потомка 
            else:  # относится к for ... in !
                raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
        # тут остальная начинка класса
        ...
    
    # а это пример потомка
    @Parent.register  # явная регистрация потомка через декоратор
    # так удобнее, потому что так можно создавать промежуточных потомков,
    # которые не будут реально использоваться - только в наследовании
    class SomeChild(Parent):
        @classmethod
        def can_handle(cls, data):
            return data.get('name', None) == 'SomeChild'  # критерий для определения - наш случай или нет?
        
        def __init__(self, data):
            self.x = data['x']
            self.y = data['y']
    
    c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69})  # создаст экземпляр SomeChild
    print(c)
    try:
        Parent.make({'name': 'invalid'})  # потерпит неудачу
    except TypeError as err:
        print(err)
    Ответ написан
    Комментировать
  • Какой процессор лучше?

    @Akela_wolf
    Extreme Programmer
    Во-первымх, вы бы хоть модели процессоров написали. Эти слова, без понимания какая микроархитектура за ними стоит - ни о чем.
    Во-вторых, фуллстек - это вообще что за зверь? Какие конкретные задачи должен решать компьютер?

    Если поиграть в телепата, то для программирования - особой разницы нет. Лично я бы взял шестиядерник, под запуск разных контейнеров (докер, вагрант и т.п.), в однопотоке у него неплохой турбобуст.
    Ответ написан
    Комментировать
  • Нормальная ли практика удалять, изменять, создавать данные get запросом, а не post?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ненормальная. HTTP-клиенты, включая бразуер, рассчитывают на идемпотентность GET-запросов, а потому могут выполнить его без спросу или повторить произвольное количество раз. Так что не удивляейтесь, если после захода на страницу с комментариями произойдёт их удаление, хотя вы ничего не нажимали.
    Ответ написан
    2 комментария
  • Какая лучшая практика тестировать api?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Мокапить запросы на внешние ресурсы
    Ответ написан
    Комментировать
  • Какая лучшая практика тестировать api?

    @Akela_wolf
    Extreme Programmer
    Этот - никак. Как минимум нужно избавиться от захардкоденого домена и вынести его в конфиг. Дальше возможны варианты:
    1. Wiremock - создает локальный сервер и отвечает на запросы к нему. То есть, "прикидывается" внешним сервисом для вашей программы.
    2. Юнит-тесты. Но для них нужно изолировать обращения к внешнему сервису и "закрыть" их интерфейсом, вместо которого будет подставляться тестовая реализация внешнего сервиса.
    Ответ написан
    Комментировать
  • Как организовать model django?

    Mi11er
    @Mi11er
    A human...
    Какой то дубль вопроса
    Ответ написан
    Комментировать
  • Как переключиться на другую ветку?

    Wyrd
    @Wyrd
    Архитектор
    Не мучайтесь (если, конечно, вы не фанат консоли), поставьте бесплатный https://www.sourcetreeapp.com/ - он умеет почти все что умеет консоль (если Source Tree не хватило, то вы что-то сильно сделали не так, например, "случайно" сделали hard reset)
    Ответ написан
    3 комментария
  • Как можно упростить данный код?

    @kamenyuga
    В таком виде код почти ничего не делает. Просто меняет структуру данных - список кортежей превращает в словарь, затем в список кортежей. Единственное значимое изменение - суммирование. Так просто используй сразу подходящую структуру. Например, словарь. И вся функция превращается в одну строчку внутри цикла.
    foo = dict()
    
    min_amount = 1
    for type_, amount in (('food', 4), ('food', 3), ('car', 3), ('dog', 1)):
        foo[type_] = foo.get(type_, 0) + (amount if amount >= min_amount else 0)
    
    print(*sorted(foo.items(), key=lambda x: x[1]), sep='\n')
    Ответ написан
    Комментировать
  • Где ошибка в JSON?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Форматтер и валидатор. Твой пример он сам исправил и написал, что удалил запятую
    https://jsonformatter.curiousconcept.com/
    Ответ написан
    Комментировать
  • Где ошибка в JSON?

    @ilyaQA
    Quallity Assurance
    Запятую убрать надо после
    "max_passengers": 5
    Ответ написан
    Комментировать
  • Где ошибка в JSON?

    Запятая после последнего элемента.
    Ответ написан
    Комментировать
  • Flask. TypeError: Object of type Product is not JSON serializable?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    jsonify не умеет сериализовывать классы, для начала нужно информацию подготовить:
    data = [{'id': p.id, 'uid': p.user_id, 'pid': p.product_id} for p in Product.query.all()]
    return jsonify(data)
    Ответ написан
    Комментировать
  • Как улучшить данный код?

    @NicolayChe
    В задаче есть логика

    import math
    order=50
    box=[0, 0, 0]
    box[2]=box[2]+order//18*2
    order%=18
    qty_box=[math.ceil(order/3), math.ceil(order/6), math.ceil(order/9)]
    min_qty_box=min(qty_box)
    index_min_qty_box=qty_box.index(min_qty_box)
    free_place=[(min_qty_box*3-order), (min_qty_box*6-order),(min_qty_box*9-order)]
    min_free_place=min(free_place[index_min_qty_box:])
    box[free_place.index(min_free_place)]+=min_qty_box
    print(box)
    Ответ написан
    3 комментария
  • Как реализовать данный метод?

    @LeoMay
    Студент
    Еще способ методом get, вдобавок к предыдущим:
    text  =  "ala ala lapa papa ala lapa"
    d = {}
    
    for i in text.split(' '):
        d[i] = d.get(i, 0) + 1
    Ответ написан
    Комментировать
  • Как реализовать данный метод?

    Комментировать
  • Как реализовать данный метод?

    Amoralny
    @Amoralny
    Python-разработчик
    Вот так :D
    # split() - превратит строку в список, в аргумент можно передать сепаратор, по которому будет вестись объединение
    to_check = "ala ala lapa papa ala lapa".split() 
    data = {}
    
    for i in to_check:
        if i not in data:
            data.update({i:to_check.count(i)})
    
    print(data)
    Ответ написан
    5 комментариев
  • Как реализовать данный метод?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    foo = 'ala ala lapa papa ala lapa'
    
    foo_count = {word: foo.split().count(word) for word in set(foo.split())}
    # {'ala': 3, 'lapa': 2, 'papa': 1}
    Ответ написан
    Комментировать
  • Где ошибка в javascript?

    JamesHatfield
    @JamesHatfield
    Front-end developer
    Здесь ошибка не в JS коде а в стилях. Настройте стили классов 'btn btn-primary' и 'mb-4 tweet'
    Ответ написан
    Комментировать
  • Javacript получить данные Django rest?

    @Israfil22
    Старайтесь использовать новый синтаксис(es6), он более очевидный и простой в поиске ошибок.

    В консоль должна попасть либо ошибка, которая скажет о том, что вы обращаетесь на некорректно работающий адрес, либо выведется полученный ответ от адреса, на который совершается запрос.
    Также есть явная проблема - в результате скорее всего вам приходит json. Его необходимо как-то обработать и превратить в список(если только в json не хранится весь список). Я оставил вам пометку, где должен находиться этап преобразования json в массив.

    const asyncRequst = async (url) => {
        const request = await fetch(url)
        return resultBody = await request.json()
    }
    
    const fillTweetBlock = async () => {
      try{
        const result = await asyncRequst('/tweets')
        console.log(result)
    
        const listedItems = //ТУТ нужно обработать json в объекте result и получить ваш список.
    
        const finalTweetStr = listedItems.reduce((acc, element, index) => {
          console.log(index)
          console.log(element)
          return acc + `<div class='mb-4'><h1>${element.id}</h1><p>${element.content}</p></div>\n`
        }, '')
    
        tweetsElement.innerHTML = finalTweetStr;
      }
      catch(e){
        console.log('Error occured: ', e)
      }
    }
    fillTweetBlock()
    Ответ написан
    3 комментария
  • Кто больше зарабатывает: веб-дизайнер или верстальщик?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Их шеф.
    Ответ написан
    Комментировать