• Существует ли аналог Proxy и Reflect (как в JS) для Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Существует ли аналог Proxy и Reflect (как в JS) для Python?

    Встроенных аналогов нет, но можно реализовать самому.

    Аналог Proxy:
    class Proxy:
        def __init__(self, target):
            self.target = target
    
        def __getattr__(self, name):
            print(f"Пытаемся получить атрибут {name}")
            if isinstance(self.target, dict):
                return self.target.get(name, None)
            return getattr(self.target, name, None)
    
        def __setattr__(self, name, value):
            if name == 'target':
                super().__setattr__(name, value)
            else:
                print(f"Устанавливаем значение {value} для атрибута {name}")
                if isinstance(self.target, dict):
                    self.target[name] = value
                else:
                    setattr(self.target, name, value)
    
    obj = Proxy({'x': 1})
    print(obj.x)
    obj.x = 2

    Как функция:
    class Proxy:
        def __call__(self, *args, **kwargs):
            print("Объект вызван как функция")
    
    p = Proxy()
    p()

    Аналог Reflect:
    obj = {'x': 1}
    print(getattr(obj, 'x', None))
    setattr(obj, 'x', 2)

    Управлять классами в момент создания:
    class Meta(type):
        def __new__(cls, name, bases, dct):
            print(f"Создается класс {name}")
            return super().__new__(cls, name, bases, dct)
    
    class MyClass(metaclass=Meta):
        pass
    Ответ написан
  • Как ROISTAT понимает что заявка пришла от кампании директа?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    При интеграции Roistat и Директа - к объявлениям или ключевым фраза прикручивается некий roistat_id (или как то так). По нему Roistat понимает, откуда именно пришел посетитель.
    Ответ написан
    Комментировать
  • TypeError: 'NoneType' object is not callable?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    massage_handler - массаж обработчика?

    Табуляция для await message.answer вышла из чата?
    @dp.massage_handler()
    async def echo(message: types.Message):
    await message.answer(message.text)

    Попробуйте так:
    from aiogram import Bot, Dispatcher, executor, types
    
    # Bot init
    bot = Bot(token="6563641220:AAFBWH_TQ4SW_Zk-6sVyBpeX5rSJitWoRQM")
    dp = Dispatcher(bot)
    
    # echo
    @dp.message_handler()
    async def echo(message: types.Message):
        await message.answer(message.text)
    
    # Запуск лонг-полинг
    if __name__ == "__main__":
        executor.start_polling(dp, skip_updates=True)
    Ответ написан
    Комментировать
  • Как удалить из строки каждый третий символ?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    let str = "abcdefg";
    let newStr = "";
    for (let i = 0; i < str.length; i++) {
      if ((i + 1) % 3 !== 0) {
        newStr += str[i];
      }
    }
    console.log(newStr);

    Или:
    let str = "abcdefg";
    let newStr = [...str].filter((_, index) => (index + 1) % 3 !== 0).join("");
    console.log(newStr);
    Ответ написан
    Комментировать
  • Как лучше организовать поиск сотрудников?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Подскажите, как лучше организовать поиск сотрудников, если их больше 2000, делать один запрос к API и получать сразу всех из БД(mysql) и среди них искать нужного или каждый раз делать поиск конкретного пользователя?

    Если данные сотрудников не изменяются и часто необходимо итерироваться по массиву с объектами всех сотрудников, то имеет смысл единоразово получить с бэка весь массив и сохранить его в store для дальнейшего взаимодействия с ним. В ином случае, лучше запрашивать данные с бэка о конкретном сотруднике.

    Вернуть объект сотрудника, id которого равно 2:
    employees

    const employees = [
        {
            "id": 1,
            "name": "Leanne Graham",
            "username": "Bret",
            "email": "Sincere@april.biz",
            "address": {
                "street": "Kulas Light",
                "suite": "Apt. 556",
                "city": "Gwenborough",
                "zipcode": "92998-3874",
                "geo": {
                    "lat": "-37.3159",
                    "lng": "81.1496"
                }
            },
            "phone": "1-770-736-8031 x56442",
            "website": "hildegard.org",
            "company": {
                "name": "Romaguera-Crona",
                "catchPhrase": "Multi-layered client-server neural-net",
                "bs": "harness real-time e-markets"
            }
        },
        {
            "id": 2,
            "name": "Ervin Howell",
            "username": "Antonette",
            "email": "Shanna@melissa.tv",
            "address": {
                "street": "Victor Plains",
                "suite": "Suite 879",
                "city": "Wisokyburgh",
                "zipcode": "90566-7771",
                "geo": {
                    "lat": "-43.9509",
                    "lng": "-34.4618"
                }
            },
            "phone": "010-692-6593 x09125",
            "website": "anastasia.net",
            "company": {
                "name": "Deckow-Crist",
                "catchPhrase": "Proactive didactic contingency",
                "bs": "synergize scalable supply-chains"
            }
        },
    ]


    const employee = employees.find(emp => emp.id === 2);
    Ответ написан
    Комментировать
  • Как оптимизировать проект Next.js?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Делаю форму регистрации на Next.js, 4 страницы. Хочу ускорить загрузку страниц, но не понимаю, какой рендеринг для этого использовать

    Здесь необходимо уточнение, что понимается под "ускорить загрузку", если Вы имеете ввиде именно сборка страницы, то выбирайте пре-рендеринг. Выбирать между SSR и ISR (необходимо страницу заранее сбилдить, либо использовать кеш), SSG (тут итак билд страницы идет заранее, если fallback не равен true).

    SSR
    ISR
    SSG
    Ответ написан
    Комментировать
  • Почему SwiperSlide в столбик?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Попробуйте более подробный вариант кода слайдера от сюда https://codesandbox.io/s/66c8pc?file=/src/App.jsx , что получилось? Если результат прежний, не или не такой, как в песочнице, то выкладывайте здесь полный код своей страницы, на которой выводится слайдер.
    Ответ написан
    Комментировать
  • Как выплачивать деньги пользователям за предоставление услуги?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    У меня есть сайт с онлайн-курсами, на котором учителя создают курсы. Ученики покупают эти курсы. Как мне теперь делать переводы учителю (выплачивать его долю) от имени моего ИП?

    Оферта с обоими, деньги берете от ученика и выплачиваете учителю, оставляя себе разницу. Банковский счёт - Ваш, как буфер.
    Я даже примерно не представляю, где об этом узнать. Может где-то чаты тематические есть?

    Нанять налогового юриста по этому вопросу Вам будет стоить гораздо меньше, чем сыграть с одноруким товарищем. При текущей системе Налог-3 - игра начнётся достаточно рано.
    Ответ написан
    7 комментариев
  • Почему react router не видит айдишник в урле?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    React Router 6 слегка иначе обрабатывается динамические роуты, попробуйте так:
    export const routes = [
      { path: '/', element: <MainPage /> },
      { 
        path: '/posts', 
        element: <Posts />,
        children: [
          { path: ':postId', element: <PostIdPage /> }
        ]
      },
      { path: '/about', element: <About /> },
      { path: '/*', element: <Error /> },
    ]

    const renderRoutes = (routes) => {
      return (
        <Routes>
          {routes.map((route, index) => (
            <Route key={index} path={route.path} element={route.element}>
              {route.children && renderRoutes(route.children)}
            </Route>
          ))}
        </Routes>
      );
    };

    export default function App() {
      return (
        <div>
          {renderRoutes(routes)}
        </div>
      );
    }
    Ответ написан
  • Как скачать аудиофайл с помощью selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Selenium
    Python, JS, WordPress, SEO, Bots, Adversting
    JS не нужен, все относительно просто:
    from selenium import webdriver
    import requests
    import os
    
    # юзаем хром
    driver = webdriver.Chrome()
    
    # ссылка на сайт для примера (может быть временная, поэтому бдим в оба)
    driver.get('https://cdndl.zaycev.net/track/24932675/4srdJGcFYp791F9ABjYLyvNgexnUL8z7GFNMQiNEsrSRee43ZHFr7YoijrrsDraGx7sYdrvkXeKCzu8CwmWR5jBtHr5i49hH8LZ21oYQM6NQzzKomzZKtphTL5f6dNqGddRuMCQNeHGHMkY64WvroQwEvattc4FcXXhJFrxecgAwnEuHvUWxonULTacHy2wXrVhQAWGPgeXg7gnxMr5MNQ6wq9k35Lh3Dkrnuac678AgKKFkN4QY9ymyEL5gi7JfiqomuSVTsYDNb4WHrrFk2ixFia5Lq8ZahJmRgCGCPqJ8ny2jykXrQekfAJdC8e9rxL8wUnLMBcpPeGFJyZ1p64U2VptfeY')
    
    # ищем элемент по css селектору
    audio_element = driver.find_element_by_css_selector("source[type='audio/mpeg']")
    
    # извлекаем url из элемента
    audio_url = audio_element.get_attribute('src')
    
    # качаем файл
    response = requests.get(audio_url)
    if response.status_code == 200:
        # если файл успешно качнули, то сохраняем в downloads (папка downloads уже должна существовать)
        with open('downloads/audio.mp3', 'wb') as f:
            f.write(response.content)
    
    driver.quit()
    Ответ написан
    Комментировать
  • Стоит ли новичку учить next 12 или лучше сразу 13?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Стоит ли новичку учить next 12 или лучше сразу 13?

    Сразу учите 13, затем, при необходимости - дополняйте знания от <=12 версии.
    Слышал что в 13 версии полностью поменяли все концепции

    Позже снова все поменяют, традициям нельзя изменять!
    Ответ написан
    Комментировать
  • Как поборот накрутку 404 страницы?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Убрать счетчик на 404 странице?
    Ответ написан
    Комментировать
  • Как сделать запрос с локального хоста react axios?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    CORS заголовки должны быть установлены на сервере, который отвечает на Ваш запрос (в данном случае, Google API), а не на Вашем клиенте. Это механизм безопасности браузеров, и заголовки CORS должны быть установлены на стороне сервера. Если сервер настроен так, чтобы не принимать запросы с Вашего домена или IP-адреса, то на клиенте (в Вашем React-приложении) эту проблему не решить.

    Можно поднять свой локальный сервер, например на express.js и использовать его как прокси:
    import express from 'express';
    import cors from 'cors';
    import axios from 'axios';
    
    const app = express();
    
    app.use(cors());
    
    app.get('/getBooks', async (req, res) => {
      try {
        const result = await axios.get('https://www.googleapis.com/books/v1/users/1112223334445556677/bookshelves&key=myKeyApi');
        res.json(result.data);
      } catch (error) {
        console.error(error);
        res.status(500).send(error);
      }
    });
    
    app.listen(4000, () => {
      console.log('Proxy server running on http://localhost:4000');
    });

    Либо попробовать заюзать прокси на клиенте, указав его в package.json:
    {"proxy": "https://www.googleapis.com"}
    Ответ написан
    6 комментариев
  • Почему я получаю разные значения из bytes при итерации и при высчитывании шестнадцатеричного числа вручную?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вероятно, Вы не учли символы > и _, которые также являются частью Вашей строки bytes. Коды этих символов (62 и 95) в десятичной системе и являются теми числами, которые вызывали у Вас вопросы.

    data = b'>\x02\xfe\xbf_\xec\xe6\xee\x00R'
    
    for i in range(len(data)):
        hex_repr = '\\x{:02x}'.format(data[i])
        print(i, data[i], f"({hex_repr})")
    
    # 0 62 (\x3e)
    # 1 2 (\x02)
    # 2 254 (\xfe)
    # 3 191 (\xbf)
    # 4 95 (\x5f)
    # 5 236 (\xec)
    # 6 230 (\xe6)
    # 7 238 (\xee)
    # 8 0 (\x00)
    # 9 82 (\x52)
    Ответ написан
    1 комментарий
  • Как сверстать такой блок?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Если Вы хотите, чтобы размеры ячеек были определены исключительно размерами изображений, то гриды не лучший вариант, а вот флексы - да. Для заполнение колонки изображением, использовал object-fit (contain/cover).


    Если задача будет еще сложнее, то лучше использовать masonry grid, например https://masonry.desandro.com/ .
    Ответ написан
    7 комментариев
  • Как выбрать значение в дропдаун меню используя selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Got error selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated

    Как можно поправить? На экране он виден

    Для парсера он не виден, по разным причинам.

    Попробуйте так:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("example.com")
    
    # находим и кликаем на элемент .SumoSelect
    dropdown_container = driver.find_element(By.CSS_SELECTOR, ".SumoSelect")
    dropdown_container.click()
    
    # ждем появления элемента li.opt label, но не более 10 сек
    option_to_select = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "li.opt label"))
    )
    
    # итерируемся по всем option и кликаем, если текст option равен AB
    for option in options:
        if "AB" == option.text.strip():
            option.click()
            break
    else:
        print("Не удалось найти нужную опцию.")
    
    driver.quit()
    Ответ написан
    1 комментарий
  • Почему код разбиения на слагаемые не работает?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему когда я указываю большие разбиваемого и количества слогаемых,вылетает ошибка:
    print(partition(1024,5))

    Превышено количество рекурсивных вызовов в Python.

    Можно увеличить глубину рекурсий:
    import sys
    sys.setrecursionlimit(5000)

    Либо, переписать функцию в итеративном стиле:
    def partition(n, k):
        stack = [(n, k, [])]
        while stack:
            current_n, current_k, current_partition = stack.pop()
            
            if current_n == 0 and current_k == 0:
                print(" + ".join(map(str, current_partition)))
            elif current_n == 0 or current_k == 0:
                continue
            elif current_n < 0:
                continue
            else:
                for i in range(1, current_n+1):
                    new_n = current_n - i
                    new_k = current_k - 1
                    new_partition = current_partition + [i]
                    stack.append((new_n, new_k, new_partition))
    
    partition(5, 3)
    Ответ написан
    1 комментарий
  • Flexbox использовать как контейнер?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    может-ли флексбокс быть одновременно флексконтейнером

    Может для чего? CSS и законом не запрещено.
    Т.е., есть ли возможность не вставлять в флексбокс новый фл.контейнер

    Можете разобрать пример Bootstrap flex сетки. Там, для балансировки горизонтальных отступов используется вариант с двойным контейнером: .container (padding-x) > .row (negative margin-x) > .col (padding-x).

    Сделать горизонтальные отступы с .flex > .col (с одним контейнером) так же, как в Grid layot можно лишь динамическим высчитыванием этих отступов, использую css calc {}
    Ответ написан
  • Какую ответственность несет провайдер в случае взлома?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Ущерб какого рода?
    Подмена DNS, Man-in-the-middle attack, Спуфинг
    Если роутер захватить развлечений можно много придумать

    1. Нужно смотреть договор с провайдером, какие предусмотрены (и компенсации за них) там присутствуют (предположу - никаких).
    2. Вам нужно будет доказать причинённый Вам ущерб, это множество экспертиз и вероятно, месяцы если не годы судебных тяжб.
    Какую ответственность несет провайдер в случае взлома?

    Зависит от п1 и п2.
    А провайдер в суде разведет лапки и скажет ну это наши поставщики не обновляли прошивки 7 лет, а мы не при чем.
    Так выходит?

    Не совсем. Провайдер в суде заявит, что вообще ничего не было, затем скажет, что ущерб причинён не ими, а значит и вопросы не к ним.
    Ответ написан
    Комментировать