• Зачем нужны приложения?

    @newpy
    web-dev
    Попробую привести немного по-другому пример: проект - это сайт, а приложения части сайта, тематически и главное логически разделенные. Например на сайте ведется блог, это приложение пусть называется "блог". На сайте есть гостевая книга - это другое приложение (по логике вещей гостевая книга же не относится к блогу, ведь так? Там будут свои урлы, шаблоны, свои модели, вью, методы и тд. для работы именно с гостевой). Есть магазин - это приложение "магазин" которое тоже в общем-то не имеет отношения к блогу. А вот статьи от блога, это скорее модель приложения "блог", чем отдельное приложение. Ведь статьи напрямую относятся к блогу, и никак не к гостевой книге или магазину, там же не пишутся статьи. Получить доступ из одного приложения к другому можно, НО. Не стоит делать приложения связанными.
    Идея в том чтобы ты мог взять свое приложение "блог", и использовать его в любом другом своем проекте Сделать startproject, скопировать туда приложение blog, и должно работать. Условно ничего не переписывая "as is" (как есть). В одном проекте несколько приложений в общем никак не взаимодействуют. Для Блога будет URL ведущий и работающий с блогом, для Магазина так же, и для Гостевой. Главная страница может храниться в приложении Landing например или main. Еще на сайте/проекте может быть реализовано API это совершенно другая логика, поэтому это тоже отдельное приложение. Для понимания задай себе вопрос, например из мной приведенных примеров Products|Продукты это что и к чему из вышеописанного относится? Попробуй привести пример что еще на проекте/сайте можно выделить в приложение отдельное.

    UPD.
    a97cba340f664f4ea0b52974dbb0a6b0.png
    Ответ написан
  • Как получить поле из JSON?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Потому что там путь посложнее:
    import requests
    r = requests.get("http://search.maps.sputnik.ru/search/addr?format=json&lat&q=Песочная+аллея,+дом+1")
    print(r.json()['result']['address'][0]['features'][0]['geometry']['geometries'][0]['coordinates'])
    # [37.674698, 55.79341]


    Как вариант - можно пробежаться рекурсией и вытянуть все ключи с 'coodinates':
    coordinates = []
    
    def search_key(data, key):
        if isinstance(data, list):
            for x in data:
                search_key(x, key)
        if isinstance(data, dict):
            for x in data.keys():
                if x == key:
                    coordinates.append(data[x])
                else:
                    search_key(data[x], key)
    
    search_key(r.json(), 'coordinates')
    print(coordinates)
    # [[37.674698, 55.79341]]
    Ответ написан
    Комментировать
  • Как добавить кнопки в состояние (telegram aiogram)?

    @MEDIOFF
    Python Developer
    Ну во первых:
    kb = InlineKeyboardMarkup()
    kb.add('Маг', 'Воин', 'Вор')

    Вы тут создаете инлайн клавиатуру, но пихаете в нее простой текст, хотя для этого у вас есть - InlineKeyboardButton, ему вы задаете текст, и callback_data, которую потом с помощью декоратора @dp.callback_query_handler обрабатываете Все что вам хочется

    Т.е в вашем примере это будет выглядеть как то так:
    class States(StatesGroup):
        characterAge = State()
        characterBranch = State()
    #special - работа с бд
    @dp.message_handler(state=States.characterAge, content_types=ContentTypes.TEXT)
    async def characterAge(message: types.Message, state: FSMContext):
        try:
            int(message.text)
            special.add_new_character_age(message.text, message.from_user.username)
            await state.update_data(message=message.text.title())
            buttons = [InlineKeyboardButton('Маг', callback_data='branch:mag'),
                             InlineKeyboardButton('Маг', callback_data='branch:voin'),
                             InlineKeyboardButton('Маг', callback_data='branch:vor'),]
            kb = InlineKeyboardMarkup()
            kb.add(buttons)
            await message.answer(text='Выберите одну из трех ветвей развития вашего персонажа(Влияет на диалоги)', reply_markup=kb)
            await States.characterBranch.set()
        except IndentationError:
            await message.reply('Существа не могут жить с отрицательным возрастом')
            return
        except NameError as err:
            print(err)
            await message.reply('Возраст не может состоять из букв')
            return
    
    @dp.callback_query_handler(Text(startswith='branch:'), state=States.characterBranch)
    async def characterBranch(callback_query: types.CallbackQuery, state: FSMContext):
        branch_dict = {'mag': 'маг',
                                'voin': 'воин',
                                'vor': 'вор'}
    
        branch = callback_query.data.removeprefix('branch:')
    
        await state.update_data(characterBranch=branch_dict[branch])
    
        if branch == 'mag':
            special.add_new_character_branch('1', callback_query.from_user.username)
        elif branch == 'voin':
            special.add_new_character_branch('2', callback_query.from_user.username)
        elif branch == 'vor':
            special.add_new_character_branch('3', callback_query.from_user.username)
    
        await message.answer()
        await state.finish()
    Ответ написан
    Комментировать
  • Как перемешать между собой слова фразы?

    aRegius
    @aRegius
    Python Enthusiast
    from itertools import chain
    from random import shuffle
    from more_itertools import chunked
    
    
    sub_sentences = list(chunked(sentence.split(), 3))
    shuffle(sub_sentences)
    new_sentence = ' '.join(item for item in chain.from_iterable(sub_sentences))
    Ответ написан
    Комментировать
  • Как можно редактировать тг бота и держать его онлайн?

    SoreMix
    @SoreMix
    yellow
    Нельзя, код не будет на лету собираться. Запустили - потестили, дописали - перезапустили
    Ответ написан
    Комментировать
  • Как перемешать между собой слова фразы?

    MinTnt
    @MinTnt
    letter = 'Если плоскость проходит через данную прямую, параллельную другой плоскости, и пересекает эту плоскость, то прямая пересечения плоскостей параллельна данной прямой'
    
    def chunk(st, lns):
    	import random
    	mv = st.split()
    	mv = [' '.join(mv[x:x+lns]) for x in range(0, len(mv), lns)]
    	return ' '.join(random.sample(mv, len(mv)))
    	
    print(chunk(letter, 3))
    Ответ написан
    Комментировать
  • Как перемешать между собой слова фразы?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    import random
    
    sentence = 'Если плоскость проходит через данную прямую, параллельную другой плоскости, и пересекает эту плоскость, то прямая пересечения плоскостей параллельна данной прямой'
    
    chunk_size = 3
    words = sentence.split()
    
    chunked_words = []
    
    for i in range(0, len(words), chunk_size):
        chunked_words.append(words[i:i + chunk_size])
    
    random.shuffle(chunked_words)
    
    new_sentence = ''
    
    for chunk in chunked_words:
        new_sentence += ' '.join(chunk) + ' '
    
    print(new_sentence)
    Ответ написан
    Комментировать
  • Как вывести самую длинную цепочку из символов в алфавитном порядке?

    MinTnt
    @MinTnt
    Ну в принципе, это можно решить через regex
    import re
    from string import ascii_uppercase as as_up
    
    print(max(re.findall('*'.join(as_up)+'*', s), key=len))
    Ответ написан
    Комментировать
  • Как вывести самую длинную цепочку из символов в алфавитном порядке?

    @o5a
    Проблема из-за условия проверки
    if ord(text[i + j]) - ord(elems[-1][-1]) < 2
    в условии последовательности требуется, чтобы последующая буква была не меньше предыдущей, не понятно, с чего Вы вдруг такое условие написали.

    Вообще нет надобности сохранять куда-то сами последовательности, тем более, что требуется только первую из самых длинных. Как можно это сделать:
    Проходим по символам последовательности и проверяем, стал ли ord() текущего символа меньше предыдущего. Если стал, то последовательность закончилась. Проверяем, не стала ли эта последовательность больше предыдущей. Если да, обновляем данные максимальной последовательности (стартовую позицию и длину).
    В противном случае переходим к следующему.
    Примерно так:
    spoiler
    text = ...
    text_len = len(text)
    max_len = 0
    max_idx = 0
    seq_idx = 0
    prev = 0
    
    for i, x in enumerate(text):
        if ord(x) < prev:
            seq_len = i-seq_idx
            if seq_len > max_len:
                max_len = seq_len
                max_idx = seq_idx
            seq_idx = i
        elif i==text_len-1:
            seq_len = i-seq_idx+1
            if seq_len > max_len:
                max_len = seq_len
                max_idx = seq_idx
        prev = ord(x)
    print(max_len, text[max_idx:max_idx+max_len])
    Ответ написан
    Комментировать
  • Как скачать .sh файл c облачного диска?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    После просмотра предупреждения ваш файл нормально скачивается в Firefox.

    google-drive-shell-script-download-virus-scan-warning.png

    google-drive-bash-sh-file-download-firefox.png
    Ответ написан
    Комментировать
  • Как скачать .sh файл c облачного диска?

    @vitaly_il1
    DevOps Consulting
    А какое сообщение?
    У меня Хром на Маке предупреждает, но дает сделать "download anyway".
    Для настоящих гиков - https://github.com/wkentaro/gdown
    Ответ написан
    3 комментария
  • Из-за майнинговой истерии, цены взлетели только на видеокарты или на все комплектующие (процесоры, мат.платы, озу)?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Исходя из того, что процессор/материнка для майнинга могут быть любые, а в качестве блоков питания домашние деятели предпочитают брать серверные б/у, делаю вывод, что затронуты только видеокарты.
    Ответ написан
    Комментировать
  • Как получить информацию с элемента?

    ValarMayar
    @ValarMayar
    Д У Р А Ч О К / недопрограммист графоман
    soup = BeautifulSoup(product_url, 'lxml')
    # ищем всё, что находится внутри тега <div class="product-content-v1">
     product_detailt_page = soup.find_all('div', {'class': 'product-content-v1'}) 
    
     # ищем нужные внутренние элементы(в Вашем случае эти блоки с инфой)
        for child in product_detailt_page:
            try:
                full_name = child.find(class_='brand-and-name').get_text()
            except AttributeError:
                full_name = ''


    Это примитивная реализация того, что вам нужно.
    Ответ написан
    Комментировать
  • Как показать путь к выбранному пользователем файлу?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Эээ... ну, я не вникал глубоко, как понял, так поправил.
    код
    from tkinter import Button, Entry, StringVar, Tk
    from tkinter.constants import E, END
    from tkinter.filedialog import askopenfilename
    
    
    class App(Tk):
        def __init__(self):
            super().__init__()
            self.resizable(False, False)
            self.title('InClass')
    
            # !org
            self.labelORG = Button(self, text='Предприятие')
            self.labelORG.grid(row=1, sticky=E)
    
            self.stringORG = StringVar()
            self.entryORG = Entry(self, textvariable=self.stringORG)
            self.entryORG.grid(row=1, column=1, columnspan=2)
    
            self.buttonORG = Button(self, text='Выбрать:', command=self._select_CSV_table())  # , self.entryORG
            self.buttonORG.grid(row=1, column=3)
    
        def _select_CSV_table(self):
            my_path = askopenfilename(filetypes=(('CSV file', '*.csv'), ('Any', '*')))
            self.entryORG.delete(0, END)
            self.entryORG.insert(0, my_path)
            print(my_path)
    
    
    if __name__ == '__main__':
        app = App()
        app.mainloop()

    Это точно не "best practice", просто поправил, что попалось под руку.

    p.s. 'path' - системная переменная, не надо ее переиспользовать.
    Ответ написан
    2 комментария
  • Как ввести в input почту и нажать на кнопку?

    mallo_c
    @mallo_c
    Зачем я изучил VBS???
    Можно через selenium
    На худой конец, имитировать клики с pynput
    Ответ написан
    Комментировать
  • Как удержать подключение к sql серверу с помощью python pyodbc?

    @o5a
    Во-первых, можно просто не закрывать соединение. Или использовать ту же самую глобальную переменную-соединение, или для удобства создать класс, обеспечивающий работу с базой, например так:
    # пример был для sqlite, но принцип одинаков
    class DataBase():
        def __init__(self, database_name):
            self.conn = sqlite3.connect(database_name)
            self.cursor = self.conn.cursor()
    
        def commit(self):
            self.conn.commit()
    
        def close(self):
            self.conn.close()
    
    # затем создаем один раз объект-соединение и с ним уже работаем
    db = DataBase('...')
    c = db.cursor
    c.execute('CREATE TABLE ...)')
    c.execute('INSERT INTO TABLE ...)')
    db.commit()
    # где нужно используем один и тот же объект-соединение


    Во-вторых для выполнения множественных операций (как в данном случае insert) вместо execute есть команда executemany. Ей как раз передается вложенный список строк данных, и она будет исполняться гораздо эффективнее повторного вызова execute по каждой строке.
    Ответ написан
    Комментировать
  • Как получить переменную, которая находится внутри класса?

    shabelski89
    @shabelski89
    engineer
    перепишите как в примере, метод grid отдельно
    self.label_driver = Label(self, text="Драйвер:")
            self.label_driver.grid(row=0, sticky=E)
            self.entry_driver = Entry(self)
            self.entry_driver.grid(row=0, column=1)

    для всех блоков, и все заработает
    Ответ написан
    Комментировать
  • Как сделать кнопку проверки пути к файлу?

    @o5a
    Если уже используется глобальная pat то ее и нужно вызывать в rucheck (а параметр вообще убрать).
    def takeCSV():
        global pat
        pat = filedialog.askopenfilename(filetypes = (("CSV Files","*.csv"),))
        root.title(f'file at {pat}')
    
    def runCheck():
        global pat
        if pat != '':
            os.system(f'start {pat}')
    ....
    # и убрать параметр pat
    bCheck = Button(text='check', command=runCheck)


    Или можно вообще отказаться от глобальных и писать как атрибуты root
    def takeCSV():
        root.filename = filedialog.askopenfilename(filetypes = (("CSV Files","*.csv"),))
        root.title(f'file at {root.filename}')
    
    def runCheck():
        if root.filename:
            os.system(f'start {root.filename}')
    ....
    # и тоже убрать параметр pat
    bCheck = Button(text='check', command=runCheck)
    Ответ написан
    Комментировать
  • Как сделать кнопку проверки пути к файлу?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В программе надо сделать две функции, одна получает путь к файлу и возвращает его в переменную; вторая функция открывает этот файл (кстати, открыла, и че? ну, это другой вопрос). Сделать две кнопки, повесить на каждую по функции. Всё...
    Ответ написан
    3 комментария