__init__ в наследовании классов Python
День добрый, искал похожие темы, но не нашел в них ответа на свой вопрос. Книга из которой пример (Эрик Метиз - Изучаем Python) внятного объяснения тоже нет, либо я не понимаю его.
Итак, классический пример: есть класс родитель и его метод:

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        long_name = (f"\nЭто ваша машина: {self.make} {self.model} {self.year}")
        return long_name.title()

И есть класс наследник:

class Electric_Car(Car):
    def __init__(self, make, model, year, price):
        self.price = price
        super().__init__(make, model, year)
        self.battery_size = 75

    def get_descriptive_name(self):
        super().get_descriptive_name()
        long_name = (f"\nЭто ваша машина: {self.make} {self.model} {self.year} {self.price}")
        return long_name.title()

Собственно вопросы:

Комментарий в книге к  строке def
__init__(self, make, model, year): класса Electric_Car следующий - "Метод
__init__() получает информацию, необходимую для создания экземпляра Car ."
Мне он ни о чем не говорит, пытаясь изменить эти параметры я получаю ошибку. Но я могу добавить в конец списка новый параметр и прописать (например
self.price = price) под этой строкой. Почему тогда первые 3 параметра нельзя изменить?

В строке
super().__init__(make, model, year) я не могу не добавить ни изменить параметры, т.к будет ошибка. Так как это параметры класса родителя?

Если я изменю любой параметр строки
def __init__(self, make, model, year): то в строке
super().__init__(make, model, year) он будет подчеркнут красным, соответственно эти параметры связаны, зачем тогда дублирование строк?

Я захотел переопределить метод
def get_descriptive_name(self), добавлением в него строки
super().get_descriptive_name() а так же параметра
self.price в переменную, правильно ли это?

P.S Посоветуйте толковую книгу по Python где все более детально описывается.

1, 2: Через
super().__init__(...) вызывается
__init__ родительского класса, в него нужно передать именно те параметры, который для
__init__ родительского класса нужны. Можно, конечно, передать какие-то другие параметры, но работать не будет, или будет работать неправильно :)

Но я могу добавить в конец списка новый параметр и прописать...

- не обязательно в конец, можно в середину или в начало, главное чтобы при создании объекта передавались правильные значения в правильные параметры. Никакого правила, которое запрещает добавлять свои параметры в любое место, нет (кроме правила, что именованные параметры должны идти после позицонных). Но обычно чтобы не запутаться, лучше добавлять в конец.
3: это не дублирование.
def __init__(...) - это объявление метода, а
super().__init__(...) - это вызов метода. Если метод не вызвать, то сам он не запустится. Если вызывать метода с другим количеством параметров, чем было объявлено, то в данном случае это будет ошибкой (могут быть конечно методы со значениями параметров по умолчанию и всякими
*args,
**kwargs, но в данном случае этого нет, поэтому количество параметров должно совпадать).
4: в данном случае переопределенный метод никак не использует значение, возвращаемое родительским методом, и родительский метод никак не меняет состояние объекта (или "внешнего мира"), поэтому (опять же, в данном случае) в вызове родительского метода нет особого смысла. В других случаях вызов родительского метода может быть необходим.


Помогите исправить ошибку "TypeError: on_raw_reaction_add() missing 1 required positional argument: "
Почему когда я пытаюсь передать функции
async def on_raw_reaction_add более одного аргумента появляется такая ошибка:

TypeError: on_raw_reaction_add() missing 1 required positional argument: 'ctx'
Сам код:

import discord
from discord.ext import commands

client = discord.Client()

@client.event
async def on_raw_reaction_add(payload, ctx):
    print("test")

client.run(TOKEN)

Если оставить только один аргумент, например
payload то все работает.
Подскажите пожалуйста, как это исправить.

Аргументы функции передаете не вы, а
Discord API, при вызове функции из чата дискорда.
Смотрим в документацию и видим, что функция
on_raw_reaction_add() принимает только один аргумент -
payload. Поэтому, когда вы пытаетесь передать еще и
ctx, Python сообщает вам, что функция не получила 1 аргумент. А не получила именно потому, что его не отправлял
Discord API.

Наверное, пытаясь принять аргумент
ctx, вы хотели получить контекст команды, как у команд с декоратором
client.command(). Здесь, вместо него передается
payload, из которого тоже можно получить все
необходимые данные:

payload.channel_id - id канала, в сообщении которого была добавлена реакция
payload.emoji      - объект эмоджи; для получения символа примените str(payload.emoji)
payload.event_type - тип события (подробнее в документации)
payload.guild_id   - id сервера, в сообщении которого была добавлена реакция
payload.member     - объект участника сервера, который добавил реакцию
payload.message_id - id сообщения, для которого была добавлена реакция
payload.user_id    - id пользователя, который добавил реакцию

А сами объекты можем получать уже из ID:

channel = bot.get_channel(payload.channel_id)
emoji = str(payload.emoji)
guild = bot.get_guild(payload.guild_id)
member = payload.member
message = await channel.fetch_message(payload.message_id)
user = await client.fetch_user(payload.user_id )

Ну и если сильно хочется, можно назвать аргумент
payload как
ctx.
Discord API все равно передаст один и тот же объект. Главное, не забывайте, что этот
ctx не будет иметь те же объекты, что и контекст команды

@client.event
async def on_raw_reaction_add(ctx):
    print(ctx.channel_id)


Как сделать проверку на выигрышь 3 в ряд?
Функция получает номер переставленного элемента и она должна проверить, получается ли по вертикали либо горизонтали так, что элементы с одинаковым цветом стоят в ряд (линию).
<code>
def check(i2, j2):
strok_left = 0
stolb_up = 0
strok_right = 0
stolb_down = 0
ball = 0
for j in range(i2, n):
    if a[i2][j] == a[i2][j+1]:
        strok_left+=1
    else:
        break
for j in range(0 ,i2+1, -1):
    if a[i2][j] == a[i2][j+1]:
        strok_right+=1
    else:
        break
if strok_right + strok_left >= 3:
    ball += (strok_right + strok_left)
print(ball)
</code>
А у меня  работает через раз. Пока что делал проверку только по строкам.

Просто перебираем все 8 направлений от текущей позиции и считаем ячейки которые равны текущей...

def check(field, row, col):
    n_rows = len(field)
    n_cols = len(field[0])
    # счетчики (себя учитываем изначально):
    counters = {(0,1): 1,    # по горизонтали
                (1,0): 1,    # по вертикали
                (1,1): 1}    # по диагонали
    # обход по всем 8ми направлениям
    # (9ти, на самом деле, но комбинация 0:0 - это топтание на месте)
    for drow in (-1, 0, 1):
        for dcol in (-1, 0, 1):
            if drow == 0 and dcol == 0:
                continue   # исключаем топтание на месте
            pos_row = row + drow
            pos_col = col + dcol
            # идём в выбранную сторону до тех пор пока ячейка поля
            # соответствует текущей, либо до границы поля
            while (0 <= pos_row < n_rows and
                   0 <= pos_col < n_cols and
                   field[row][col] == field[pos_row][pos_col]):
                # увеличиваем соответствующий направлению счётчик
                counters[(abs(drow), abs(dcol))] += 1
                # переходим к следующей ячейке в выбранном направлении
                pos_row += drow
                pos_col += dcol

    print(counters) # посмотрим на счётчики (просто для отладки)
    # проверка на то, что любой из счётчиков больше или равен 3
    return any(count >= 3 for count in counters.values())

a = [[0,0,1,0,0],
     [1,1,1,0,0],
     [0,0,1,0,0],
     [0,0,1,1,0],
     [0,1,0,0,0]]

# распечатаем наше поле
print(" "*4, ": ".join(map(str, range(len(a[0])))), ":", sep="")
for i, row in enumerate(a):
    print(f"{i}: {row}")

for row, col in [(1,0), (2,2), (3,3), (4,1), (4,4)]:
    print(f"\nПроверяю позицию - ряд:{row}, столбец:{col} ...   ", end="")
    print("Результат проверки:", "Есть" if check(a, row, col) else "Нет", "3 в ряд")

Результат:

D:\Programming\Python\>python check3.py
    0: 1: 2: 3: 4:
0: [0, 0, 1, 0, 0]
1: [1, 1, 1, 0, 0]
2: [0, 0, 1, 0, 0]
3: [0, 0, 1, 1, 0]
4: [0, 1, 0, 0, 0]

Проверяю позицию - ряд:1, столбец:0 ...   {(0, 1): 3, (1, 0): 1, (1, 1): 1}
Результат проверки: Есть 3 в ряд

Проверяю позицию - ряд:2, столбец:2 ...   {(0, 1): 1, (1, 0): 4, (1, 1): 3}
Результат проверки: Есть 3 в ряд

Проверяю позицию - ряд:3, столбец:3 ...   {(0, 1): 2, (1, 0): 1, (1, 1): 3}
Результат проверки: Есть 3 в ряд

Проверяю позицию - ряд:4, столбец:1 ...   {(0, 1): 1, (1, 0): 1, (1, 1): 2}
Результат проверки: Нет 3 в ряд

Проверяю позицию - ряд:4, столбец:4 ...   {(0, 1): 3, (1, 0): 5, (1, 1): 1}
Результат проверки: Есть 3 в ряд


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

while s.count('900') or s.count('8000') or s.count('70'):
        s = s.replace('70', '8', 1)
        s = s.replace('900', '70', 1)
        s = s.replace('8000', '900', 1)

Для строки "7008900700800" результатом будет "808880800". Но мне нужен алгоритм, который вернет обработанную строчку в изначальное состояние. Я попробовал его сделать, поменял местами аргументы в replace, 1ую строку под while поменял с 3ьей и заменил условие, и вроде бы все логично, но где то ошибка.

while s.count('8') or s.count('70') or s.count('900'):
    s = s.replace('900', '8000', 1)
    s = s.replace('70', '900', 1)
    s = s.replace('8', '70', 1)

Помогите составить алгоритм который будет работать, я уже все кажется перепробовал.

Мне кажется, что-бы понять, что задача не имеет однозначного решения, достаточно на вход вашего алгоритма подать три строки '9000', '700', и '80' и во всех случаях получить одинаковый результат.  Ну, можно еще забавы ради попытаться однозначно расшифровать то, что получилось после пропускания через ваш алгоритм строки '80000900070080'.


Как создать список из функций (+, -, *, /)
Как создать список из функций (+, -, *, /) используя функцию, которая как аргумент принимает имя (текстом) одной из 4-х арифметических операций
1я часть задачи заключалась в том, чтобы написать функцию, которая как аргумент принимает имя (текстом) одной из 4-х арифметических операций (сумма, сложение, вычитание, деление) и возвращает другую функцию,
которая выполняет эту операцию для 2х переменных:

def func_factory(operation):
    if operation == 'summ':
        def summ(a, b):
            return a + b

        return summ
    elif operation == 'mul':
        def mul(a, b):
            return a * b

        return mul и т.д.

summation = func_factory('mul')
res = summation(12, 2)
print(res)

2я часть. Используя эту функцию нужно создать список из полученных функций (выполняющих арифметические операции) и применить их по очереди к одной и той же паре аргументов
Должно получиться:

lst = [summ, mul, subtract, divide]
for func in lst:
    func(x,y)

Вот решения ваших задач
<code>
def func_factory(operation):
    if operation == 'summ':
        def summ(a, b):
            return a + b
        return summ
    elif operation == 'mul':
        def mul(a, b):
            return a * b

        return mul
    elif operation == 'subtract':
        def subtract(a, b):
            return a - b

        return subtract
    elif operation == 'divide':
        def divide(a, b):
            return a / b

        return divide
    else:
        raise Exception

x = int(input())
y = int(input())
funcs_names = ['summ', 'mul', 'subtract', 'divide']
lst = [func_factory(i) for i in funcs_names]
for func in lst:
    print(func(x, y))
</code>


помогите решить задачку. Условие ниже
Вам дано предложение: s = "There is some numbers: 49 and 432. How, to? split. text! I 123 can 45 play 67 football.". С помощью библиотеки re вам нужно из исходного предложения удалить всё кроме слов, точки, восклицательного знака и знака вопроса. Слова и наши знаки окончания предложения должны быть разделены пробелом. Символы приведены к нижнему регистру. Используйте метод sub или findall.
вот тут моя попытка сделать это самостоятельно:
<code>
import re
s=input()
s=s.lower()
re = re.sub("[49325671,:]", '', s)
res = ''.join(map(lambda ch: ch+' ', re))
print(res)
</code>

Ну, что, ж, следуя вашей логике:

import re
s = "There is some numbers: 49 and 432. How, to? split. text! I 123 can 45 play 67 football."
s = s.lower()
pattern = r":?\s\d{1,}|,"
# буквально значит "двоеточие (ноль или больше раз), пробельный символ, любая цифра (один или более раз) ИЛИ запятая
t = re.sub(pattern, "", s)

и как результат имеем:

>>> t
'there is some numbers and. how to? split. text! i can play football.'


JSON формат, а стоит ли его читать?
Сегодня был задан вопрос на ruSO и касается отображения файла JSON в удобочитаемом варианте для человека. Вопрос занял мою голову на весь день, да, и отрицать популярность данного формата на сегодняшний день глупо. Поговорил с коллегами, попытался узнать: кто-нибудь в реальных задачах применяет
pretty-printed JSON-файлы. Ответ оказался отрицательным. Но нашлись примеры борьбы с излишним количеством знаков у
front-end разработчиков на
javascript и это вроде как рутинная обработка и они не обращают внимание на это.
Поскольку вышеуказанный вопрос касался непосредственно
python, я полез читать что же написано в документации по этому поводу, а точнее параметра
indent. И вот что там:

.... and object members will be pretty-printed with that indent level.

Да, я допускаю, что представление структуры JSON в виде иерархии очень показательно при обучении, но после программисты продолжают использовать данные с кучей пробелов и переводами строк. Пример из последнего: один товарищ пытается отослать команды на кастомную PLC систему (она принимает JSON, но что под капотом у нас доступа нет) и возмущается, что ничего не работает. Чистим JSON -> все работает.
Как я это вижу и почему я не хочу читать данные файлы глазами. Все дело в том, что дальнейшая обработка полученных данных заключена в работе с простым словарем (в терминологии
python). И в любом случае я буду перебирать
ключ:значение. Я могу узнать у словаря существует ли ключ, какой тип данных лежит под этим ключем, забрать данные, поместить данные и т.д.
Поскольку я постоянно с этим сталкиваюсь и мне приходится подчищать и обрабатывать такого типа файлы, возникает вопрос: существует ли реальная задача (здесь я понимаю "не учебная"), где необходимо было бы использовать красоту в иерархии JSON-файла? Может кто-то сталкивался? Может быть я действительно чего-то не замечаю.

Как по любому вопросу, который засел в голове, пришлось провести мини-исследование. Темой которого стало: "Нужен ли
pretty-printed JSON?" Для ленивых сразу спойлер - мой ответ: "Да, нужен". Отправной точкой стали комментарии оставленные под вопросом.
Итак, по порядку:

JSON - текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Wiki. Основой стал
XML, а цель создать облегченную версию формата обмена данными. Т.е. изначально закладывалась идея возможности чтения без различных кодировщиков и интерпретаторов.
JSON позволяет легко читать структуру запросов\ответов к API. Да, в документации к различным API содержатся структуры запросов именно в
pretty-printed JSON. Это действительно удобно и сокращает время на создание\понимание запросов. (по мотивам комментария от Roman Konovalov)
Конфигурации. Здесь не все так однозначно и есть противники использования JSON формата для конфиг файлов, но
ASP.Net core использует, а также нашел еще парочку открытых примеров. Но очень расстроился, когда понял, что пример лежит перед самым носом. VSCode позволяет конфигурировать себя с помощью JSON, черт. F1->
Preferences: Open Settings (JSON). Удобно, ли, читать и форматировать? Естественно. (по мотивам комментариев от Roman Konovalov, MaxU)
Различного рода отладка. Здесь я остался при том мнении, что читать я не буду. Получение данных и дальнейшая обработка - задачи, которые решаются при помощи написания кода. Отлавливать глазами, а потом писать обработку? Можно, же, сразу писать обработку, реализовывать исключения для непонятных данных и проч. Но чтобы к этому прийти, сдается мне, что по началу я тоже читал глазами.
Для самого
pythona нашел библиотеку для использования переменных сред из JSON файла. json-environ. Удобство чтения и использования на лицо. Вряд ли лучшее решение для меня, но все же.

Для баз данных ничего интересного не нашел кроме того, что функционал различных DB поддерживается для работы с JSON (postgres, SQL Server). Насколько необходимо иметь красивый JSON, не понятно.
Что по итогу:
Вопрос изначально не был состоятельным. Если закладывают в формат на старте возможность, зачем в принципе это отрицать. Если я не использую
pretty-printed JSON - это абсолютно не значит, что никому это не нужно. Но полностью согласен, что "... гонять по сети и хранить следует json в компактном виде" (Alexander Petrov).


Графики в matplotlib накладываются друг на друга
Такая проблема что я использую дискорд.py и у меня при вызове несколько раз функций графики накладываются друг на друга.
вот код
<code>
@client.command()
async def stat(ctx):

    ibv = randint(1, 20)
    listc = []
    listm = []
    for i in range(ibv):
        listc.append(i)
    for i in range(ibv):
        listm.append(randint(1, 20))

    plt.plot(listc, listm)
    rand = randint(1, 10)

    plt.savefig("graf.png")
    await ctx.send(file = discord.File(fp = f'graf.png'))
</code>

После plt.savefig("graf.png") нужно добавить
<code>
plt.close()
</code>
Тогда в графики не будет ничего добавляться


Как распарсить несколько файлов одновременно с помощью модуля argparse
Есть файлы summon.txt, summon_2.txt, summon_3.txt.
Написан вот такой код:
<code>
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-f', dest='some_file', action='store', default='summon.txt')
args = parser.parse_args()
</code>
Этот код позволяет парсить только один файл за раз. А нужно, чтобы можно было парсить одновременно все.

Нужно добавить параметр
nargs='*', чтобы можно было указать 0 и более файлов, либо
nargs='+', если должно быть указано не менее одного файла:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-f', nargs='*', dest="files", default=['summon.txt'], help='A list of files to process')

args = parser.parse_args(["-f", "summon.txt", "summon_2.txt", "summon_3.txt"])
print(args)  # Вывод: Namespace(files=['summon.txt', 'summon_2.txt', 'summon_3.txt'])

args = parser.parse_args(["-f"])
print(args)  # Вывод: Namespace(files=[]) (считается, что передан список из нуля файлов)

args = parser.parse_args([])  # Если -f не передано вообще, то используется default значение
print(args)  # Вывод: Namespace(files=['summon.txt'])

См. argparse, nargs


парсинг списка html в словарь
Как лучше из такого списка:

<ul>
    <li><b>Штрих-код</b> <span>4810948005595</span></li>
    <li><b>Страна</b> <span>БЕЛАРУСЬ</span></li>
    <li><b>В наличии</b> <span>13 шт.</span></li>
</ul>

cоздать словарь на питоне?
Cейчас делаю так:

html = """
    <ul>
        <li><b>Штрих-код</b> <span>4810948005595</span></li>
        <li><b>Страна</b> <span>БЕЛАРУСЬ</span></li>
        <li><b>В наличии</b> <span>13 шт.</span></li>
    </ul>
"""

soup = Soup(html, 'html.parser')
desc = soup.select("ul li")
about= {}
for el in desc:
    about[el.find("b").text] = el.find("span").text
print(about)

from bs4 import BeautifulSoup

html = '''
<ul>
    <li><b>Штрих-код</b> <span>4811530000325</span></li>
    <li><b>Страна</b> <span>БЕЛАРУСЬ</span></li>
    <li><b>В наличии</b> <span>1 шт.</span></li>
</ul>
'''
soup = BeautifulSoup(html, 'html.parser')

Словарь можно сгенерировать с помощью dict comprehension:

my_dict = {i.find('b').text: i.find('span').text for i in soup.find_all('li')}

тогда в
my_dict:

>>> my_dict
{'Штрих-код': '4811530000325', 'Страна': 'БЕЛАРУСЬ', 'В наличии': '1 шт.'}


'charmap' codec can't decode byte 0x98 При чтении файла
Суть в том, что я шифрую файлы

def encrypt_file(self, in_filename, out_filename=None, chunksize=64 * 1024):
    if not out_filename:
        out_filename = in_filename + '.enc'

    iv = Random.new().read(AES.block_size)
    encryptor = AES.new(self.key, AES.MODE_CBC, iv)
    filesize = os.path.getsize(in_filename)

    with open(in_filename, 'rb') as infile:
        with open(out_filename, 'wb') as outfile:
            outfile.write(struct.pack('<Q', filesize))
            outfile.write(iv)

            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += bytes(' ' * (16 - (len(chunk) % 16)), 'utf-8')

                outfile.write(encryptor.encrypt(chunk))

а потом дешифрую

def decrypt_file(self, in_filename, out_filename=None, chunksize=24 * 1024):
    if not out_filename:
        out_filename = os.path.splitext(in_filename)[0]

    with open(in_filename, 'rb') as infile:
        origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
        iv = infile.read(16)
        decryptor = AES.new(self.key, AES.MODE_CBC, iv)

        with open(out_filename, 'wb') as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                outfile.write(decryptor.decrypt(chunk))

            outfile.truncate(origsize)
    os.remove(in_filename)

я уже пробовал ставить кодировки при открытии, примерно как здесь, но безуспешно.

with open(in_filename, encoding="utf-8" ,mode ='rb') as infile:

Как исправить эту ошибку?

'charmap' codec can't decode byte 0x98 in position 231495: character maps to

Сдаётся мне, что вы где-то читаете совершенно другой файл в текстовом режиме. Причём делаете это в неправильной кодировке. Например, файл в кодировке
utf-8 читаете в Windows без явного указания кодировки (к примеру, у Windows с русской locale кодировка по-умолчанию
cp1251).
Для теста, я создал файл со смайликом в кодировке
utf-8. В нём записано всего 4 байта с кодами
\xF0\x9F\x98\xA2, которые представляют вот этот символ: 😢
Далее, я открывал файл с указанием кодировки и без:

with open('test.txt', 'r', encoding='utf-8') as f:
    print("utf-8")
    text = f.read()
    print("Done")

with open('test.txt', 'r') as f:
    print("default")
    text = f.read()
    print("Done")

И на втором чтении (без указания кодировки) я получил вашу ошибку (и даже на том же самом злополучном байте
0x98):

D:\Programming\Python\1>python codepage.py
utf-8
Done
default
Traceback (most recent call last):
  File "codepage.py", line 8, in <module>
    text = f.read()
  File "C:\Python37\lib\encodings\cp1251.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 19: character maps to <undefined>


Ошибка в коде "TypeError: can only concatenate list (not "int") to list"?
Реализую метод Ньютона.
Возникают непонятные для меня ошибки.
Ругань на функцию
deriveF_y, которая возвращает не целое число и возникает проблема с тем, чтобы присоединить это число в список.
Что не так и как это можно исправить?
Код:

import math

def funcF(x, y):
    return((2 * x) - math.cos(y + 1)) # math.sin(x + 1) - y - 1.2

def funcG(x, y):
    return(y + math.sin(x) + 0.4) # 2 * x + math.cos(y) - 2

def derivedF_x(x):
    return(2) # math.cos(x + 1)

def derivedG_x(x):
    return (math.cos(x)) # 2

def derivedF_y(y):
    return (math.sin(y + 1)) # -1

def derivedG_y(y):
    return(1) # -math.sin(y)

def Determ(func1, func2, func3, func4):
    return(func1 * func4 - func2 * func3)

def NewtonMethod(el_x, el_y):
    e = 0.0001
    k = 0
    dN = Hn = Kn = 0
    dN = Determ(derivedF_x(el_x), derivedF_y(y), derivedG_x(x), derivedG_y(el_y))
    Hn = Determ(derivedF_y(y), funcF(el_x, el_y), derivedG_y(el_y), funcG(el_x, el_y)) / dN
    Kn = Determ(funcF(el_x, el_y), derivedF_x(el_x), funcG(el_x, el_y), derivedG_x()) / dN

    #Нахождение корней сис-мы
    while(abs(Hn) >= e and abs(Kn) >= e):
        el_x += Hn
        el_y += Kn
        dN = Determ(derivedF_x(el_x), derivedF_y(y), derivedG_x(x), derivedG_y(el_y))
        Hn = Determ(derivedF_y(y), funcF(el_x, el_y), derivedG_y(el_y), funcG(el_x, el_y)) / dN
        Kn = Determ(funcF(el_x, el_y), derivedF_x(el_x), funcG(el_x, el_y), derivedG_x()) / dN
        k += 1
    print("\nКорни системы:")
    print(" x =", "%.5f" % el_x, "y = ", "%.5f" % el_y)
    print("Количество итераций:", k)

arg = [-3, -2.6, -2.2, -1.8, -1.4, -1, -0.6, -0.2, 0.2, 0.6, 1]
x, y = [], []

#Заполнение значениями ф-й
for i in arg:
    y.append(math.cos(i + 1) / 2) # math.sin(i + 1) - 1.2
    x.append(-math.sin(i)-0.4) # -math.cos(i)/2 + 1

#Определение начальных точек
el_x, el_y = x[5], y[5]
print("Начальные точки приближения:\n x =", "%.2f" % el_x, "\n y =", el_y)

NewtonMethod(el_x, el_y)

Текст ошибки:

Traceback (most recent call last):
  File "./prog.py", line 56, in <module>
  File "./prog.py", line 28, in NewtonMethod
  File "./prog.py", line 16, in derivedF_y
TypeError: can only concatenate list (not "int") to list

Проблема была с неправильными аргументами (вместо
el_x там было
x, например) и тем, что
derivedG_x() был без аргументов в двух местах.
Вот исправленный код, который работает:

import math

def funcF(x, y):
    return((2 * x) - math.cos(y + 1)) # math.sin(x + 1) - y - 1.2

def funcG(x, y):
    return(y + math.sin(x) + 0.4) # 2 * x + math.cos(y) - 2

def derivedF_x(x):
    return(2) # math.cos(x + 1)

def derivedG_x(x):
    return (math.cos(x)) # 2

def derivedF_y(y):
    return (math.sin(y + 1)) # -1

def derivedG_y(y):
    return(1) # -math.sin(y)

def Determ(func1, func2, func3, func4):
    return(func1 * func4 - func2 * func3)

def NewtonMethod(el_x, el_y):
    e = 0.0001
    k = 0
    dN = Hn = Kn = 0
    dN = Determ(derivedF_x(el_x), derivedF_y(el_y), derivedG_x(el_x), derivedG_y(el_y))
    Hn = Determ(derivedF_y(el_y), funcF(el_x, el_y), derivedG_y(el_y), funcG(el_x, el_y)) / dN
    Kn = Determ(funcF(el_x, el_y), derivedF_x(el_x), funcG(el_x, el_y), derivedG_x(el_y)) / dN

    #Нахождение корней сис-мы
    while(abs(Hn) >= e and abs(Kn) >= e):
        el_x += Hn
        el_y += Kn
        dN = Determ(derivedF_x(el_x), derivedF_y(el_y), derivedG_x(el_x), derivedG_y(el_y))
        Hn = Determ(derivedF_y(el_y), funcF(el_x, el_y), derivedG_y(el_y), funcG(el_x, el_y)) / dN
        Kn = Determ(funcF(el_x, el_y), derivedF_x(el_x), funcG(el_x, el_y), derivedG_x(el_y)) / dN
        k += 1
    print("\nКорни системы:")
    print(" x =", "%.5f" % el_x, "y = ", "%.5f" % el_y)
    print("Количество итераций:", k)

arg = [-3, -2.6, -2.2, -1.8, -1.4, -1, -0.6, -0.2, 0.2, 0.6, 1]
x, y = [], []

#Заполнение значениями ф-й
for i in arg:
    y.append(math.cos(i + 1) / 2) # math.sin(i + 1) - 1.2
    x.append(-math.sin(i)-0.4) # -math.cos(i)/2 + 1

#Определение начальных точек
el_x, el_y = x[5], y[5]
print("Начальные точки приближения:\n x =", "%.2f" % el_x, "\n y =", el_y)

NewtonMethod(el_x, el_y)


Каким образом избавиться от global в коде?
Имеется простой echo скрипт для общения с ботом. В методах использовал global, чтобы изменить переменные. Подскажите хорошую замену для этой процедуры, чтобы обойтись локальными переменными или может быть чем-то еще. Сколько я не пытался что-либо придумать, ничего не выходит. Опыта маловато пока.
Исходный код:
<code>
import telebot
from telebot import types

bot = telebot.TeleBot('180*:AA*M')

name = ''
surname = ''
age = 0

@bot.message_handler(content_types=['text'])
def start(message):
    if message.text == "/reg":
        bot.send_message(message.from_user.id, "What's your name?")
        bot.register_next_step_handler(message, get_name)
    else:
        bot.send_message(message.from_user.id, "Write /reg")

@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
    if call.data == "yes":
        bot.send_message(call.message.chat.id, "I'm remember this, but this is not exactly")
    elif call.data == "no":
        bot.send_message(call.message.chat.id, "Mda")

def get_name(message):
    global name
    name = message.text
    bot.send_message(message.from_user.id, "What's your surname?")
    bot.register_next_step_handler(message, get_surname)

def get_surname(message):
    global surname
    surname = message.text
    bot.send_message(message.from_user.id, "How old are you?")
    bot.register_next_step_handler(message, get_age)

def get_age(message):
    global age
    while age == 0:
        try:
            age = int(message.text)

        except Exception:
            bot.send_message(message.from_user.id, "Numerals please")
    keyboard = types.InlineKeyboardMarkup()
    key_yes = types.InlineKeyboardButton(text="Yes", callback_data="yes")
    keyboard.add(key_yes)
    key_no = types.InlineKeyboardButton(text="No", callback_data="no")
    keyboard.add(key_no)
    question = "You are " + str(age) + " old, your name is " + name + " " + surname + "?"
    bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)

bot.polling(none_stop=True, interval=0)
</code>

Всё гораздо проще, можно передавать из шага в шаг с помощью третьего аргумента:

bot.register_next_step_handler(msg, start_3, message.text)
Пример:

@bot.message_handler(commands=['start'])
def start(message):
    msg = bot.send_message(message.chat.id, 'Введите *название организации*', parse_mode='Markdown')
    bot.register_next_step_handler(msg, start_2)

def start_2(message):
    msg = bot.send_message(message.chat.id, 'Введите *ФИО заявителя*', parse_mode='Markdown')
    bot.register_next_step_handler(msg, start_3, message.text)

def start_3(message, company):
    last = message.text.split()[0]
    first = message.text.split()[1]
    middle = message.text.split()[2]

    phone_btn = telebot.types.ReplyKeyboardMarkup(True, True)
    phone_btn.add(types.KeyboardButton(text='Отправить номер', request_contact=True))
    msg = bot.send_message(message.chat.id, 'Нажмите кнопку *Отправить номер* ниже', parse_mode='Markdown',
                           reply_markup=phone_btn)
    bot.register_next_step_handler(msg, start_4, first, last, middle, company)

def start_4(message, first, last, middle, company):
    if message.contact is not None:
        start_5(message, first, last, middle, company, message.contact.phone_number)

def start_5(message, first, last, middle, company, phone):
    bot.send_message(message.chat.id, 'Ваши данные:\n{}\n{} {} {}\n{}'.format(company, last, first, middle, phone),
                     reply_markup=types.ReplyKeyboardRemove())


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

        if (math2(px) + 1, math2(pz)) not in generatedChunks:
            generatedChunks.append((math2(px) + 1, math2(pz)))
            generate((px + 8)//8*8, math1(pz))

Функции:

@njit(cache=True, nopython=True, fastmath=True, parallel=False)
def math2(s):
    return s//8

@njit(cache=True, nopython=True, fastmath=True, parallel=False)
def math1(s):
    return s//8*8

Но игра тормозит. Есть ли более производительный алгоритм поиска, можно ли оптимизировать этот?

Пожалуй, суммирую всё вместе.

if (math2(px) + 1, math2(pz)) not in generatedChunks:
    generatedChunks.append((math2(px) + 1, math2(pz)))
    generate((px + 8)//8*8, math1(pz))

В худшем случае вы в этом фрагменте 3 раза считаете один и тот же кортеж. Лучше вынесите этот кортеж в переменную. Вернее, в 3-м случае у вас другой кортеж, но, возможно, лучше использовать всё же один и тот же кортеж, надо тестировать:

chunk = (math1(px) + 1, math1(pz))
if chunk not in generatedChunks:
    generatedChunks.append(chunk)
    generate(chunk)

Как абсолютно верно заметил insolor, сделайте
generatedChunks вместо списка множеством, и тогда скорость поиска элемента значительно вырастет, если
generatedChunks достаточно велик.
Далее, насчёт
Numba:

@njit(cache=True, nopython=True, fastmath=True, parallel=False)
def math2(s):
    return s//8

@njit(cache=True, nopython=True, fastmath=True, parallel=False)
def math1(s):
    return s//8*8

Вы проводили какие-нибудь тесты? Моя интуиция подсказывает и проведённые тесты подтверждают, что для таких небольших вычислений без векторов и циклов
Numba не ускоряет, а замедляет вычисления (примерно в 2 раза). Лучше используйте декоратор
lru_cache, если у вас могут часто повторяться эти расчёты с одинаковыми аргументами:

from functools import lru_cache

@lru_cache()
def math2(s):
    return s//8

@lru_cache()
def math1(s):
    return s//8*8

Если же расчёты практически не повторяются - не используйте никакие декораторы, так будет быстрее всего, любой декоратор требует накладных расходов и в худшем случае замедляет скорость исполнения функций, а не ускоряет. Нужно понимать, что вы делаете и проводить тесты, а не слепо пользоваться декораторами "потому что они ускоряют". Ускоряют, но в подходящих им сценариях использования.


Найти в одномерном массиве минимальное чётное число и максимальное нечётное число [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 2 года назад.

                        Улучшить вопрос

Помогите пожалуйста написать программу на питон, которая будет находить в одномерном массиве минимальное чётное число и максимальное нечётное число.
Программа в основном написана, но не получается найти минимальное чётное число.
<code>
n=int(input("Введите количество элементов, которые будут в списке:"))
b=[]
for i in range(0,n):
    a=int(input("Элемент:"))
    b.append(a)
c=[]
d=[]
for i in b:
    if(i%2==0):
        c.append(i)
    else:
        d.append(i)
c.sort()
d.sort()
count1=0
count2=0
for k in c:
    count1=count1-1
for j in d:
    count2=count2+1
print("Минимальное четное число:",c[count1+1])
print("Максимальное нечетное число",d[count2-1])
</code>

n = int(input("Введите количество элементов, которые будут в списке:"))
b = []
for i in range(n):
    a = int(input("Элемент:"))
    b.append(a)

c = []
d = []
for i in b:
    if i % 2 == 0:
        c.append(i)
    else:
        d.append(i)

c.sort()
d.sort()
print("Минимальное четное число:",c[0])
print("Максимальное нечетное число",d[-1])


Регулярные выражения, как заменить на себя же

import re
print(re.sub(r'#.{1,}?#',
             r',,,,',
             r'Эта строка #test# написана 19.01.2018,  #x# а могла бы и 01.09.2017'))

Пытаюсь заменить все
#text# на
<>#text#</>
Для этого я написал регулярное выражение #
.{1,}?#. Оно работает и в данном коде заменяет все совпадения на
,,,, . а как можно заменить на
"<>"+то что нашло +"</>"?

"То, что нашло" можно задать с помощью обратной ссылки на целое совпадение,
\g<0>:

re.sub(r'#[^#]+#', r'<>\g<0></>', text)

См. пример работы регулярного выражения.
См. пример кода на Python:

import re
print(
    re.sub(r'#[^#]+#',
           r'<>\g<0></>',
           r'Эта строка #test# написана 19.01.2018,  #x# а могла бы и 01.09.2017')
)
# => Эта строка <>#test#</> написана 19.01.2018,  <>#x#</> а могла бы и 01.09.2017


Python threads, keylog
Что должно получится в результате?
Запускается программа. Считывает все нажатия клавиш, записывая их например в список(пример ниже, но эта часть не так важна, так как я её уже написал, она исправно работает). Но параллельно, например, каждую минуту включалась нужная функция и весь тот результат(список) записывала, скидывала, сохраняла куда угодно, в общем чтобы включалась функция(функционал так же не столь важен). Как мне подсказали - использовать многопоточность.
пример:
['enter', 'd', 'h', 'F1', 'capslock', 'y'...]
Что не выходит?
Не могу правильно разобраться и структурировать код чтобы работало правильно.
Какая ошибка?
После запуска python main.py функция start() - опускается, поток не запускается соответственно функция send_data() которую должен был запустить поток - игнорируется.
Код?
<code>
from threading import Thread
from win32api import LoadKeyboardLayout
import keyboard
import time

class App:
    def __init__(self):
        self.list = list()
        keyboard.hook(self.key_logger)
        keyboard.wait()

    def start(self):
        th1 = Thread(target=self.send_data(), args=())
        th1.start()
        time.sleep(4)

    def key_logger(self, btn): # функция которая бы сохраняла нажатия в список
        res = btn.name
        print(res)

    def send_data(self): # функция которая бы отсылала нажатия например в файл
        print('i am here')

if __name__ == '__main__':
    LoadKeyboardLayout('00000409', 1) # устанавливаем англ. язык
    App().start()
</code>
Очень буду благодарен если поможете с кодом и объяснениями.
P.S. Сори если для кого-то этот вопрос слишком легкий и кажется тупым.

Я не пользовался модулями, которые Вы используете здесь, однако, исходя из документации, могу предположить следующее:
В конструкторе класса Вы вызываете метод
keyboard.wait(), который, согласно документации, блокирует выполнение навсегда, если ему не переданы параметры. Таким образом, получаем: в данной строке
App().start() сначала вызывается конструирующий метод
__init__ класса
App. Т.к. в этом методе содержится вызов блокирующего метода, выполнение программы блокируется, а значит вызов метода
start() не происходит, т.к. конструктор ещё не вернул управление и объект до конца не создан.
Решение: убрать блокирующий метод из конструктора.
Далее, хочу ещё отметить, что при передаче в конструктор класса
Thread функции, которая должна выполняться в потоке, Вы допустили ошибку, поставив скобки после неё. Вот здесь:
th1 = Thread(target=self.send_data(), args=()) после
send_data скобки не нужны. Когда Вы ставите скобки после имени функции, Вы производите её вызов, а значит аргументу
target в данном случае будет присвоено то, что вернул Ваш метод
send_data, а там должен быть сам метод, а не его возвращаемое значение. В Вашем случае метод у Вас вызовется ДО создания потока, а поток не создастся, т.к. не получит в качестве
target корректного имени функции.
Решение:
th1 = Thread(target=self.send_data, args=())


Обработчик неверных команд pytelegrambotapi
Пишу бота, в библиотеке pyTelegramBotAPI.
Столкнулся с тем, что необходимо создать обработчик неверных команд.
При вводе пользователем символов, слов, и прочего то есть команд ни как не граничащих с ботом, должен выбивать сообщение предупреждение.
<code>
words_list = ['/help']

@bot.message_handler(func=lambda message: message.text.lower() in words_list)
def send_welcome(message):
 if message:
    bot.send_message(message.chat.id, "Word detected in list!")
 else:
    bot.send_message(message.chat.id, "Word detected in list!")
</code>
К сожалению данный код не реагирует на другие случайные пользователем вводы, кроме команды /help. Как сделать так чтобы он обрабатывал любой не верный ввод и выводил ошибку?

words_list = ['/help']

@bot.message_handler(func=lambda message: message.text.lower() not in words_list)
def send_welcome(message):
 bot.send_message(message.chat.id, "Word not detected in list!")

Или так:

words_list = ['/help']

@bot.message_handler()
def send_welcome(message):
 message_text = message.text.lower()

 if message_text not in words_list:
    bot.send_message(message.chat.id, "Word not detected in list!")
 else:
    bot.send_message(message.chat.id, "Word detected in list!")


Есть некая последовательность из цифр. Нужно найти участки неубывания и нужно пропускать следующий за участком элемент
У меня есть последовательность: 3, 5, 4, 2, 1, 4, 6, 1, 0
Мне нужно вывести последовательность: 3,5; 2; 4,6; 0. Нужно пропустить 4,1,1.
По заданию нужно пропускать следующий за участком элемент. Элементы идут по возрастанию, 4<5, значит следующий анализ начать нужно с 2, а не с 4. и т.д
Я написал как не пропускать такие элементы, а как пропустить я не пойму.
Буду благодарен за помощь!
Вот мой код (и то скорее всего он не правильный):
<code>
result = []
podspisok = []
previous_number = None
for current_number in seq:
    if previous_number is None or current_number > previous_number:
        podspisok.append(current_number)
    else:
        result.append(podspisok)
        podspisok = [current_number]
    previous_number = current_number
if podspisok:
    result.append(podspisok)
print(result)

</code>

и то скорее всего он не правильный

Надо быть более уверенным в себе, я всего пару ваших строк поправил
<code>
seq = [3, 5, 4, 2, 1, 4, 6, 1, 0]
result = []
podspisok = []
previous_number = None
for current_number in seq:
    if previous_number is None or current_number >= previous_number: # нестрогий знак
        podspisok.append(current_number)
        previous_number = current_number # разделил по веткам присваивание
    else:
        result.append(podspisok)
        podspisok = [] # число, которое меньше предыдущего добавлять не нужно в следующий фрагмент
        previous_number = None # и так как оно пропускается, считаем, будто его и не существует
if podspisok:
    result.append(podspisok)
print(result) #[[3, 5], [2], [4, 6], [0]]
</code>


Репликация MSSQL в иные СУБД
Написал скрипт на питоне, который через ODBC драйвер реплицирует данные в ClickHouse (включая DDL). Однако оказалось, что алгоритм приложения для работы с БД вставляет палки в колеса. А именно производит апдейты записей, а так же удаление первичных ключей.
Забрав все эти данные, происходит коллизии т.к в кликхаус идет дублирование записей с разными ключами 50% которых уже отсутствует в MSSQL. Очень сильно мешает тот факт, что реплицируемая таблица имеет более 17кк строк.
В связи с этим вопрос, если нет возможности отложенной репликации и данные должны забираться каждые 10 минут, то как быть?
Я пришел к выводу, что необходимо парсить лист транзакций.
Спустя несколько часов изучения темы и адаптации найденного скрипта (первая версия не работала на MSSQL 2017-2019), я получил такой вот запрос.
К сожалению, он очень дорогой и на 100 записей требуется порядка 10 секунд. На 1к записей требуется 15+ минут.
Можно ли имея данный скрипт и описание, как читать лог транзакций, и решение на MSSQL перебросить нагрузку на python?
Если да, то как? У меня пока не вышло распарсить hex в питоне.
Пример hex:

0x3000410001000000B90400001000000000000000406700004D004D0000000000CB8900004A15001E004AD0E1AA37C27449B4D593524773771800000000359500001000000003005D008500BD003100340034003100370038003000370061006400760065006E0074007500720065002D0077006F0072006B0073005C006700750079003100500072006F00640075006300740069006F006E00200054006500630068006E0069006300690061006E0020002D0020005700430036003000

Описание структуры hex:

2 Byte : Status Bits
2 Bytes: Offset to find number of columns
X Bytes:Fixed Length Columns
2 Bytes: Total Number of Columns in the data row
1 Bit per column, Rounded up: Nullability Bitmap
2 Bytes:Number of Variable Length Columns within the data row
2 Bytes per variable length column : Row Offset marking the end of
each variable length column
X Bytes:Variable Length Columns

Если лог транзакций очень сильные дебри, то буду рад любым идеям, как избавиться от коллизий при репликации. И да, самое важное, оперативная память ограничена 2гб. Держать в памяти много данных не выйдет.
Заранее спасибо!

Решением стало CDC.
Указывается таблица, которая отслеживается на предмет изменения данных. Аналог транзакционного листа, но сразу в человеческой форме.


Как из кортежа получить словарь?
Как из кортежа new_letter получить словарь?
<code>
letters = {'а': 1, 'б': 2}
name = str.casefold(input("Введите запрос:"))
for i, letter in enumerate(name):
    if letter in letters.keys():
        new_letter = (letter, letters[letter])
</code>

напишите вот так
<code>
....
    if letter in letters.keys():
        # new_letter = (letter, letters[letter])
        new_letter[letter] = letters[letter]
</code>
Сразу записывайте в словарь. Ну, и объявить не забудьте.


Как убрать автоматический перенос курсора в консоли?

for k in range(2):
    print("Hello")

Hello
Hello

А я хочу:

for k in range(2):
    print("Hello ")

Hello Hello

Не подскажите, как это сделать?

for _ in range(3):
    print('Hello', end=' ')
print()

выведет:

Hello Hello Hello

У print() есть необязательный параметр
end, со значением по умолчанию - перенос строки...

От последнего принта можно избавиться, добавив параметр flush:

for _ in range(3):
    print('Hello', end=' ', flush=True)

Hello Hello Hello

сработает для python от 3.3 и выше


Ошибка: OSError: [WinError 10049] Требуемый адрес для своего контекста неверен. Как исправить?
Помогите пожалуйста разобраться. Я пытался написать интернет чат но все время выдает ошибку при запуске сервера:OSError: [WinError 10049] Требуемый адрес для своего контекста неверен. В чем может быть проблема? Вот код сервера:
<code>
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind (('188.255.24.45',5943))
client = []
all_text=''
logins_passwards=['user1','password1']
logins_addres=[]
registred=[]
while 1 :
    print(all_text)

    try:
        data , addres = sock.recvfrom(1024)

        b=data.split()
        if  addres not in client :
            client.append(addres)

            if b[0].decode(encoding='utf-8')=='register':
                if b[1].decode(encoding='utf-8') in logins_passwards:
                    index=logins_passwards.index(b[1].decode(encoding='utf-8'))
                if b[1].decode(encoding='utf-8') in logins_passwards and logins_passwards[index+1]==b[2].decode(encoding='utf-8'):
                    registred.append(addres)
                    logins_addres.append(b[1])
                    logins_addres.append(addres)
        else:
            if addres in registred and b[0].decode(encoding='utf-8')!='register' and b[0].decode(encoding='utf-8')!='/stopserver':
                k=logins_addres.index(addres)
                all_text+='\n'+logins_addres[k-1].decode(encoding='utf-8')+': '+data.decode(encoding='utf-8')

        if data.decode(encoding='utf-8')=='/stopserver' and logins_addres[k]==addres:
            sock.close()
            exit()
        if data.decode(encoding='utf-8').split()[0]=='/ban':
            k=logins_addres.index(b'user1')
            k2=logins_addres.index(addres)
            if k2-k==1:
                banned=data.decode(encoding='utf-8').split()[1]

                if banned in registred:
                    banned_b=registred.index(banned)
                    registred.pop(banned_b-1)
                if banned in logins_passwards:
                    banned_a=logins_passwards.index(banned)
                    logins_passwards.pop(banned_a-1)
                    logins_passwards.pop(banned_a)
        for clients in registred :

            sock.sendto(all_text.encode(encoding='utf-8'),clients)
    except ConnectionResetError:
        print('Подключение разорванно.')
</code>
Заранее спасибо!

Нужно запускать со своего не в внешнего, а внутреннего ай-пи.
Потому что внешним ай-пи распоряжается роутер.


NOT NULL constraint failed, а почему?
Когда я пытаюсь создать суперпользователя

python manage.py createsuperuser

я получаю следующую ошибку

django.db.utils.IntegrityError: NOT NULL constraint failed: me_teacher.subject_id

me/models

from django.conf import settings
from django.contrib.auth.models import User, AbstractUser
from django.db import models
import sys
sys.path.append('../')
from wisdom.models import Subject

class Teacher(AbstractUser):
    name = models.CharField(max_length=20)
    surname = models.CharField(max_length=20)
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, related_name='teacher_subject',
        on_delete=models.CASCADE)

wisdom/models

from django.db import models

class Subject(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True)

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

в чём моя проблема?

Надо предоставить возможность создания пользователей без привязки к предмету (
null=True)

    subject = models.ForeignKey(Subject, related_name='teacher_subject',
        null=True, on_delete=models.CASCADE)


Если дата разного формата, как извлечь год?
Есть фрейм со столбцом
bdate. Строки могут принимать значения:

Unfiled_bdate
dd.mm
dd.mm.yyyy
yyyy

Задача, в столбце получить год (если он указан), а в ином случая - значение 'Unfiled_bdate'.
Пробовал убирать точки, чтобы потом
int значения по условию заменить на нужные, но не вышло.
Подскажите, как это эффективно реализовать (будет более 10КК строк)?
Текущие данные:

import pandas as pd

bdate = ['7.10', 'Unfiled_bdate', '23.3', '22.7.1985', '10.5.1994', '10.9.1959', '14.04.2021', '1.1.1987',
         '5.1.2005', '19.06.2021', '17.5.1997', '4.7.2000', '31.12.2006', '28.12.2006', '25.2.1998, 2.6',
         '10.8.1994', 'Unfiled_bdate', '1954', '1999'] #несколько текщих строк данных

df = pd.DataFrame()
df['bdate'] = bdate # текущий датафрейм

То, что хочу получить:

bdate_clear = ['Unfiled_bdate', 'Unfiled_bdate', 'Unfiled_bdate', '1985', '1994', '1959', '2021', '1987',
         '2005', '2021', '1997', '2000', '2006', '2006', '1998', 'Unfiled_bdate',
         '1994', 'Unfiled_bdate', '1954', '1999']

    df_clear = pd.DataFrame()
    df_clear['bdate'] = bdate_clear # желаемый результат


Как исправить ошибку: "QThread: destroyed while thread is still running"?
Как устранить данную ошибку ?
Main.py

import sys
import os
import sqlite3
import asyncio
import platform
from des import *
import subprocess
from PyQt5.Qt import *
from Main_setings_ip import *
from PyQt5 import QtCore, QtGui, QtWidgets

#----------------------------------------------- 1 пинг
class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, dictIP):
        super().__init__()
        self.dictIP = dictIP

    def run(self):
        while True:
            for k, v in self.dictIP.items():
                if v[2] == 0:
                    response = subprocess.run(["ping", k, "-n", "1", "-w", "100"], shell=True,stdout=subprocess.PIPE)
                    response = response.returncode
                    self.msleep(1)
                    self.threadSignal.emit(response, k, v)
#            self.finished.emit()

#----------------------------------------------- 2 пинг
class WorkThread_1(QtCore.QThread):
    threadSignal_1 = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, k, v):
        super().__init__()
        self.k_1 = k
        self.v_1 = v

    def run(self):
        response_1 = subprocess.run(["ping", self.k_1, "-n", "4", "-w", "100"], shell=True,stdout=subprocess.PIPE)
        response_1 = response_1.returncode
        self.msleep(1)
        self.threadSignal_1.emit(response_1, self.k_1, self.v_1)
#------------------------------------------------

class MyWin(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.startThread)
        self.ui.pushButton_2.clicked.connect(self.clear_plainText)

        self.thread = None

        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.ui.tableWidget.horizontalHeader().setMinimumSectionSize(0)
        self.ui.plainTextEdit.setReadOnly(True)

        self.row_count = 1

        self.tab()

    def tab(self):
        # Подключение к БД
        sqlite_connection = sqlite3.connect("New.db")
        cursor = sqlite_connection.cursor()
        sqlite_select_query = """SELECT ip FROM ips"""
        cursor.execute(sqlite_select_query)
        records = cursor.fetchall()
        cursor.close()
        sqlite_connection.close()

        # Перебор ip адресов
        for row, value in enumerate(records):
            self.ui.tableWidget.setRowCount(self.row_count)
            item = QtWidgets.QTableWidgetItem(str(value[0]))
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.ui.tableWidget.setItem(row, 0, item)
            self.row_count += 1

    def clear_plainText(self):
            self.ui.plainTextEdit.clear()

    def startThread(self):
        dictIP = {}
        for row in range(self.ui.tableWidget.rowCount()):
            item = self.ui.tableWidget.item(row, 0)
            if not item.checkState():
                item.setBackground(QtGui.QColor("white"))
            dictIP[item.text()] = (row, 0, item.checkState())

        if self.thread is None:
            self.thread = WorkThread(dictIP)
            self.thread.threadSignal.connect(self.on_threadSignal)
#            self.thread.finished.connect(self.threadFinished)
            self.thread.start()
            self.ui.pushButton.setText("Stop thread")

            style_stop = """QPushButton {
                         background-color: #fa7f72;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_stop)
        else:
            self.thread.terminate()
            self.thread = None
            self.ui.pushButton.setText("Start thread")

            style_start = """QPushButton {
                         background-color: #54e346;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_start)

#----------------------------------------------- условия
    def on_threadSignal(self, response, k, v):
        #print(response, k, v)
        item = self.ui.tableWidget.item(v[0], v[1])
        #item.setCheckState(QtCore.Qt.Checked)
        if response == 1:
            self.thread_1 = WorkThread_1(k, v)
            self.thread_1.threadSignal_1.connect(self.on_threadSignal_1)
            self.thread_1.start()

        else:
            item.setBackground(QtGui.QColor("#54e346"))

    def on_threadSignal_1(self, response_1, k_1, v_1):
        #print(response_1, k_1, v_1)
        item_1 = self.ui.tableWidget.item(v_1[0], v_1[1])
        #item_1.setCheckState(QtCore.Qt.Checked)
        if response_1:
            item_1.setBackground(QtGui.QColor("#fa7f72"))

            sqlite_connection = sqlite3.connect("New.db")
            cursor = sqlite_connection.cursor()

            sqlite_select_query = """SELECT * FROM ips WHERE ip = '{}'""".format(k_1)
            cursor.execute(sqlite_select_query)
            records = cursor.fetchall()

            # Вставляем данные в PlainText
            self.ui.plainTextEdit.setReadOnly(False)
            for row in records:
                self.ui.plainTextEdit.appendPlainText(str(row[4]) + " | " + str(row[1]) + " | " + str(row[2]) + "\n" +
                                                      str(row[3]) + "\n")
            self.ui.plainTextEdit.setReadOnly(True)
        else:
            item_1.setBackground(QtGui.QColor("#ffaa00"))
#-----------------------------------------------

    # def threadFinished(self):
    #     self.thread = None
    #     self.ui.pushButton.setText("Start thread")

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())

des.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(715, 469)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/ico/Python.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color:#b2b2b2;")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setToolTip("")
        self.tab_2.setObjectName("tab_2")
        self.gridLayout = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout.setObjectName("gridLayout")
        spacerItem = QtWidgets.QSpacerItem(153, 243, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 4, 2, 2, 1)
        spacerItem1 = QtWidgets.QSpacerItem(54, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 3, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 5, 3, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_3.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_3.setMaximumSize(QtCore.QSize(136, 31))
        self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_3.setStyleSheet("QPushButton {\n"
"    background-color: #FFAA00;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 0, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(75, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 0, 3, 1, 1)
        self.tableWidget = QtWidgets.QTableWidget(self.tab_2)
        self.tableWidget.setMaximumSize(QtCore.QSize(136, 16777215))
        self.tableWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setRowCount(1)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        self.gridLayout.addWidget(self.tableWidget, 1, 1, 5, 1)
        self.pushButton = QtWidgets.QPushButton(self.tab_2)
        self.pushButton.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.tab_2)
        self.plainTextEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ForbiddenCursor))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 6, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_2.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_2.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_2.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 2, 1, 1)
        self.pushButton_5 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_5.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_5.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_5.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_5.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 2, 2, 1, 1)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.label = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 2, 1, 1)
        spacerItem4 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem4, 0, 4, 1, 1)
        self.comboBox = QtWidgets.QComboBox(self.tab_3)
        self.comboBox.setMinimumSize(QtCore.QSize(161, 31))
        self.comboBox.setObjectName("comboBox")
        self.gridLayout_2.addWidget(self.comboBox, 1, 0, 1, 2)
        self.comboBox_2 = QtWidgets.QComboBox(self.tab_3)
        self.comboBox_2.setMinimumSize(QtCore.QSize(69, 31))
        self.comboBox_2.setObjectName("comboBox_2")
        self.gridLayout_2.addWidget(self.comboBox_2, 1, 2, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.tab_3)
        self.pushButton_4.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_2.addWidget(self.pushButton_4, 1, 3, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem5, 1, 4, 1, 1)
        spacerItem6 = QtWidgets.QSpacerItem(20, 297, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem6, 2, 1, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.verticalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 715, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action123 = QtWidgets.QAction(MainWindow)
        self.action123.setObjectName("action123")
        self.action123_2 = QtWidgets.QAction(MainWindow)
        self.action123_2.setObjectName("action123_2")
        self.menu.addAction(self.action123)
        self.menu.addAction(self.action123_2)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Мониторинг"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Мониторинг"))
        self.pushButton_3.setToolTip(_translate("MainWindow", "Изменение ip и данных"))
        self.pushButton_3.setText(_translate("MainWindow", "Настройка ip"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "ip"))
        self.pushButton.setToolTip(_translate("MainWindow", "Пинг старт/стоп"))
        self.pushButton.setText(_translate("MainWindow", "Start"))
        self.plainTextEdit.setToolTip(_translate("MainWindow", "Лог панель"))
        self.pushButton_2.setToolTip(_translate("MainWindow", "Отчистить поле лог панели"))
        self.pushButton_2.setText(_translate("MainWindow", "Clear"))
        self.pushButton_5.setToolTip(_translate("MainWindow", "Обновить таблицу"))
        self.pushButton_5.setText(_translate("MainWindow", "Updae"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Пинг ip"))
        self.label.setText(_translate("MainWindow", "ip аддреса"))
        self.label_2.setText(_translate("MainWindow", "Порты"))
        self.pushButton_4.setText(_translate("MainWindow", "Подключиться"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Мониторинг"))
        self.menu.setTitle(_translate("MainWindow", "до"))
        self.action123.setText(_translate("MainWindow", "123"))
        self.action123_2.setText(_translate("MainWindow", "123"))
import res_rc

Шаблон бд

import sqlite3

# Добавление данных в таблицы

try:
    connect = sqlite3.connect("New.db")
    cursor = connect.cursor()
    print("База данных подключена к SQLite")

    cursor.execute("""CREATE TABLE IF NOT EXISTS ips(
                      ip INTEGER,
                      Gor TEXT,
                      Yi TEXT,
                      Location TEXT);""")

    connect.commit()

    records = [[f"192.168.{i}.9", "None", "None", "None"] for i in range(1, 101)]
    cursor.executemany("INSERT INTO ips VALUES (?, ?, ?, ?)", records)
    connect.commit()

    print("Запись успешно добавлена")
    cursor.close()

except sqlite3.Error as error:
    print("Ошибка при работе с SQLite", error)

finally:
    if connect:
        connect.close()
        print("Соединение с SQLite закрыто")

Я не совсем понимаю вашу логику и как вы синхронизируете
работу экземпляров класса
WorkThread_1.
Я создал список, в который помещаю объекты
thread_1 и проблема как бы ушла, попробуйте:

import sys
import os
import sqlite3
import asyncio
import platform
import subprocess
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

#from Main_setings_ip import *

#from des import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(715, 469)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/ico/Python.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color:#b2b2b2;")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setToolTip("")
        self.tab_2.setObjectName("tab_2")
        self.gridLayout = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout.setObjectName("gridLayout")
        spacerItem = QtWidgets.QSpacerItem(153, 243, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 4, 2, 2, 1)
        spacerItem1 = QtWidgets.QSpacerItem(54, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 3, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 5, 3, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_3.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_3.setMaximumSize(QtCore.QSize(136, 31))
        self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_3.setStyleSheet("QPushButton {\n"
"    background-color: #FFAA00;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 0, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(75, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 0, 3, 1, 1)
        self.tableWidget = QtWidgets.QTableWidget(self.tab_2)
        self.tableWidget.setMaximumSize(QtCore.QSize(136, 16777215))
        self.tableWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setRowCount(1)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        self.gridLayout.addWidget(self.tableWidget, 1, 1, 5, 1)
        self.pushButton = QtWidgets.QPushButton(self.tab_2)
        self.pushButton.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.tab_2)
        self.plainTextEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ForbiddenCursor))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 6, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_2.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_2.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_2.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 2, 1, 1)
        self.pushButton_5 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_5.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_5.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_5.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_5.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 2, 2, 1, 1)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.label = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 2, 1, 1)
        spacerItem4 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem4, 0, 4, 1, 1)
        self.comboBox = QtWidgets.QComboBox(self.tab_3)
        self.comboBox.setMinimumSize(QtCore.QSize(161, 31))
        self.comboBox.setObjectName("comboBox")
        self.gridLayout_2.addWidget(self.comboBox, 1, 0, 1, 2)
        self.comboBox_2 = QtWidgets.QComboBox(self.tab_3)
        self.comboBox_2.setMinimumSize(QtCore.QSize(69, 31))
        self.comboBox_2.setObjectName("comboBox_2")
        self.gridLayout_2.addWidget(self.comboBox_2, 1, 2, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.tab_3)
        self.pushButton_4.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_2.addWidget(self.pushButton_4, 1, 3, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem5, 1, 4, 1, 1)
        spacerItem6 = QtWidgets.QSpacerItem(20, 297, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem6, 2, 1, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.verticalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 715, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action123 = QtWidgets.QAction(MainWindow)
        self.action123.setObjectName("action123")
        self.action123_2 = QtWidgets.QAction(MainWindow)
        self.action123_2.setObjectName("action123_2")
        self.menu.addAction(self.action123)
        self.menu.addAction(self.action123_2)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Мониторинг"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Мониторинг"))
        self.pushButton_3.setToolTip(_translate("MainWindow", "Изменение ip и данных"))
        self.pushButton_3.setText(_translate("MainWindow", "Настройка ip"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "ip"))
        self.pushButton.setToolTip(_translate("MainWindow", "Пинг старт/стоп"))
        self.pushButton.setText(_translate("MainWindow", "Start"))
        self.plainTextEdit.setToolTip(_translate("MainWindow", "Лог панель"))
        self.pushButton_2.setToolTip(_translate("MainWindow", "Отчистить поле лог панели"))
        self.pushButton_2.setText(_translate("MainWindow", "Clear"))
        self.pushButton_5.setToolTip(_translate("MainWindow", "Обновить таблицу"))
        self.pushButton_5.setText(_translate("MainWindow", "Updae"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Пинг ip"))
        self.label.setText(_translate("MainWindow", "ip аддреса"))
        self.label_2.setText(_translate("MainWindow", "Порты"))
        self.pushButton_4.setText(_translate("MainWindow", "Подключиться"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Мониторинг"))
        self.menu.setTitle(_translate("MainWindow", "до"))
        self.action123.setText(_translate("MainWindow", "123"))
        self.action123_2.setText(_translate("MainWindow", "123"))
#import res_rc

#-------------------------------------------- 1 пинг
class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, dictIP):
        super().__init__()
        self.dictIP = dictIP

    def run(self):
        while True:
            for k, v in self.dictIP.items():
                if v[2] == 0:
                    response = subprocess.run(["ping", k, "-n", "1", "-w", "100"], shell=True,stdout=subprocess.PIPE)
                    response = response.returncode
                    self.msleep(1)
                    self.threadSignal.emit(response, k, v)
#            self.finished.emit()

#----------------------------------------------- 2 пинг
class WorkThread_1(QtCore.QThread):
    threadSignal_1 = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, k, v):
        super().__init__()
        self.k_1 = k
        self.v_1 = v

    def run(self):
        response_1 = subprocess.run(["ping", self.k_1, "-n", "4", "-w", "100"], shell=True,stdout=subprocess.PIPE)
        response_1 = response_1.returncode
        self.msleep(1)
        self.threadSignal_1.emit(response_1, self.k_1, self.v_1)
#------------------------------------------------

class MyWin(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.startThread)
        self.ui.pushButton_2.clicked.connect(self.clear_plainText)

        self.thread = None

        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.ui.tableWidget.horizontalHeader().setMinimumSectionSize(0)
        self.ui.plainTextEdit.setReadOnly(True)

        self.row_count = 1
        self.tab()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.thread_1_list = []
        self.thread_1_num = 0
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def tab(self):
        # Подключение к БД
        sqlite_connection = sqlite3.connect("New.db")
        cursor = sqlite_connection.cursor()
        sqlite_select_query = """SELECT ip FROM ips"""
        cursor.execute(sqlite_select_query)
        records = cursor.fetchall()
        cursor.close()
        sqlite_connection.close()

        # Перебор ip адресов
        for row, value in enumerate(records):
            self.ui.tableWidget.setRowCount(self.row_count)
            item = QtWidgets.QTableWidgetItem(str(value[0]))
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.ui.tableWidget.setItem(row, 0, item)
            self.row_count += 1

    def clear_plainText(self):
            self.ui.plainTextEdit.clear()

    def startThread(self):
        dictIP = {}
        for row in range(self.ui.tableWidget.rowCount()):
            item = self.ui.tableWidget.item(row, 0)
            if not item.checkState():
                item.setBackground(QtGui.QColor("white"))
            dictIP[item.text()] = (row, 0, item.checkState())

        if self.thread is None:
            self.thread = WorkThread(dictIP)
            self.thread.threadSignal.connect(self.on_threadSignal)
#            self.thread.finished.connect(self.threadFinished)
            self.thread.start()
            self.ui.pushButton.setText("Stop thread")

            style_stop = """QPushButton {
                         background-color: #fa7f72;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_stop)
        else:
            self.thread.terminate()
            self.thread = None
            self.ui.pushButton.setText("Start thread")

            style_start = """QPushButton {
                         background-color: #54e346;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_start)

#----------------------------------------------- условия
    def on_threadSignal(self, response, k, v):
        #print(response, k, v)
        item = self.ui.tableWidget.item(v[0], v[1])
        #item.setCheckState(QtCore.Qt.Checked)

        if response == 1:
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            '''
            self.thread_1 = WorkThread_1(k, v)
            self.thread_1.threadSignal_1.connect(self.on_threadSignal_1)
            self.thread_1.start()
            '''

            thread_1 = WorkThread_1(k, v)
            self.thread_1_list.append(thread_1)
            self.thread_1_list[self.thread_1_num].threadSignal_1.connect(self.on_threadSignal_1)
            self.thread_1_list[self.thread_1_num].start()
            self.thread_1_num += 1
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        else:
            item.setBackground(QtGui.QColor("#54e346"))

    def on_threadSignal_1(self, response_1, k_1, v_1):
        #print(response_1, k_1, v_1)
        item_1 = self.ui.tableWidget.item(v_1[0], v_1[1])
        #item_1.setCheckState(QtCore.Qt.Checked)
        if response_1:
            item_1.setBackground(QtGui.QColor("#fa7f72"))

            sqlite_connection = sqlite3.connect("New.db")
            cursor = sqlite_connection.cursor()

            sqlite_select_query = """SELECT * FROM ips WHERE ip = '{}'""".format(k_1)
            cursor.execute(sqlite_select_query)
            records = cursor.fetchall()

            # Вставляем данные в PlainText
# ?             self.ui.plainTextEdit.setReadOnly(False)
            for row in records:
# ? IndexError: tuple index out of range
# ?   ------------------------------------------------------>  4 <---- ?????????????????????
#                self.ui.plainTextEdit.appendPlainText(str(row[4]) + " | " + str(row[1]) + " | " + str(row[2]) + "\n" +
#                                                      str(row[3]) + "\n")
                self.ui.plainTextEdit.appendPlainText(
                    f'{row[0]} | {row[1]} | {row[2]}\n{row[3]}\n')                   #  +++

# ?             self.ui.plainTextEdit.setReadOnly(True)
        else:
            item_1.setBackground(QtGui.QColor("#ffaa00"))

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())


Python и сокеты
Я написал сервер и клиент для передачи простой строки в python. Проблема в установке подключения. Видите ли, библиотека socket сообщает, что мой IP: xx.xx.xx.xx, а сайт 2ip.ru, Windows, yandex говорят, что IP: yy.yy.yy.yy.
<code>
## Определение IP
import socket as sct
print(sct.gethostbyname(sct.gethostname()))
</code>
Друг подключался и к xx.xx.xx.xx и yy.yy.yy.yy - ничего не выходило, в программе сервера подключений не было обнаружено, порт был открыт, сервер принимает все IP. Что я делаю не так?

Покопавшись в интернете, я нашёл ещё один способ определения IP адреса, который РАБОТАЕТ с моим компьютером! Это значение Ipv4 в команде ipconfig.


Не правильное регулярное выражение

<div class="t m0 xd h373 y2d ff1b9 fs5c fc0 sc0 ls0 ws0">R-234</div><div class="t m0 xd h373 y5867 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 xd h373 y2f ff1b8 fs5c fc0 sc0 ls0 ws0">1/9/2007</div><div class="t m0 xd h373 y1793 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 x29 h373 y2d ff1b8 fs5c fc0 sc0 ls0 ws0">06BSA007K</div><div class="t m0 x29 h373 y5867 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 x29 h373 y2f ff1b8 fs5c fc0 sc0 ls0 ws0">175-05-BZ</div><div class="t m0 x29 h373 y1793 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 x29 h373 y138 ff1b8 fs5c fc0 sc0 ls0 ws0">2007000014464</div><div class="t m0 x6e h373 y2d ff1b8 fs5c fc0 sc0 ls0 ws0">Hazmat<span class="_ _c6"> </span>520<span class="_ _19d"> </span>13,16<span class="_ _14a"> </span> </div><div class="t m0 xd h19f y1651 ff1b8 fs6 fc0 sc0 ls0 ws0"> </div></div></div><div class="pi" data-data='{"ctm":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>

Пытаюсь выцепить содержимое вот этих дивов

<div class="t m0 xd h373 y2d ff1b9 fs5c fc0 sc0 ls0 ws0">содержимое </div>

для этого написал такое регулярное выражение

r = re.findall(r'<div class="t \w{2,} \w{2,} \w{2,} \w{3,} \w{3,} \w{3,} \w{3,} \w{3,} \w{3,} \w{3,}">.{1,}</div>', line)

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

<div class="t m0 xd h373 y2d ff1b9 fs5c fc0 sc0 ls0 ws0">R-234</div><div class="t m0 xd h373 y5867 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 xd h373 y2f ff1b8 fs5c fc0 sc0 ls0 ws0">1/9/2007</div><div class="t m0 xd h373 y1793 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 x29 h373 y2d ff1b8 fs5c fc0 sc0 ls0 ws0">06BSA007K</div><div class="t m0 x29 h373 y5867 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 x29 h373 y2f ff1b8 fs5c fc0 sc0 ls0 ws0">175-05-BZ</div><div class="t m0 x29 h373 y1793 ff1b8 fs5c fc0 sc0 ls0 ws0"> </div><div class="t m0 x29 h373 y138 ff1b8 fs5c fc0 sc0 ls0 ws0">2007000014464</div><div class="t m0 x6e h373 y2d ff1b8 fs5c fc0 sc0 ls0 ws0">Hazmat<span class="_ _c6"> </span>520<span class="_ _19d"> </span>13,16<span class="_ _14a"> </span> </div><div class="t m0 xd h19f y1651 ff1b8 fs6 fc0 sc0 ls0 ws0"> </div></div></div><div class="pi" data-data='{"ctm":[1.000000,0.000000,0.000000,1.000000,0.000000,0.000000]}'></div></div>

что я не правильно написал в регулярном выражении?

В регулярном выражении нет захвата (смволов группировки). В этом случае результат регулярного выражения - вся совпадающая строка.
Вам надо примерно так:

r = re.findall(r'
(.{1,})
', line);
print r;


Как выполнить поиск по модели Django
Дано: id контракта (например 32812) получить из обьектов модели кредитной заявки (!!!) уникальные id производителей всех товаров, которые связаны с этим контрактом при выполнении постараться минимизировать обращение к базе данных
<code>
class Credit(models.Model):
    """
    Кредитная заявка. Только один контракт но несколько товаров

    """
    name_credit = models.TextField(max_length=200, verbose_name='name_credit',null=True)
    contract = models.ForeignKey('Contract',
                                 verbose_name='contract', related_name='contract', on_delete=models.CASCADE)
    # product = models.ForeignKey('Product',
    #                             verbose_name='product',
    #                             related_name='product',
    #                             on_delete=models.CASCADE)
    date = models.DateField(verbose_name='date', blank=True, null=True)

    def __str__(self):
        return "%s" % self.name_credit

    class Meta:
        verbose_name = 'Кредитная заявка '
        verbose_name_plural = 'Кредитные заявки'

class Contract(models.Model):
    """
    Контракт связан с кредитной заявкой

    """
    #product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name='product', null=True)
    contracts = models.TextField(max_length=200,
                                verbose_name='contracts')

    date = models.DateField(verbose_name='date', blank=True, null=True)
    credit = models.ForeignKey(Credit, on_delete=models.CASCADE, null=True, blank=True,related_name='credit')
    manufacturer = models.ForeignKey('Manufacturer',
                                     on_delete=models.CASCADE, null=True)

    def __str__(self):
        return "%s" % self.contracts

    class Meta:
        verbose_name = 'Контракт '
        verbose_name_plural = 'Контракты'

class Product(models.Model):
    """
    Товар имеет только одного производителя

    """
    credit = models.ForeignKey(Credit, on_delete=models.CASCADE, null=True, blank=True)
    products = models.TextField(max_length=100, verbose_name='products')
    manufacturer = models.ForeignKey('Manufacturer',
                                     on_delete=models.CASCADE, related_name='manufacturer', null=True, blank=True)

    def __str__(self):
        return "%s" % self.products

    class Meta:
        verbose_name = 'Товар'
        verbose_name_plural = 'Товары'

class Manufacturer(models.Model):
    """
    Производитель производит только один продукт

    """
    name = models.TextField(max_length=200, verbose_name='name')
    #product = models.ManyToManyField('Product', related_name='product')

    def __str__(self):
        return "%s" % self.name

    class Meta:
        verbose_name = 'Производитель'
        verbose_name_plural = 'Производители'
</code>
что написать во вьюхе  что бы найти id товара находящегося в контракте?
Как я думаю. У меня есть id контракта наверное через форму как то сделать. что бы потом Id перехватить и вставить во вьюху. после чего ищем в кредитной заявке Id завода.. PLZ help

Как вариант простого поиска, попробуй
<code>
from django.db.models import Q

def search(request):
    query = request.GET.get('query')
    contracts = Contract.objects.filter(Q(credit.id__icontains=query) )

    context = {
        'query': query,
        'contracts': contracts
    }
return render(request, 'search.html', context)
</code>


Что я делаю не так. Помогите

import asyncio
import subprocess
from colorama import init, Fore
import time
import keyboard
import cv2
import sys

init()
print(f'{Fore.RED}██████╗░██╗░██████╗░█████╗░░█████╗░██████╗░██████╗░  ██████╗░░█████╗░████████╗')
time.sleep(0.1)
print(f'██╔══██╗██║██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔══██╗  ██╔══██╗██╔══██╗╚══██╔══╝')
time.sleep(0.1)
print(f'██║░░██║██║╚█████╗░██║░░╚═╝██║░░██║██████╔╝██║░░██║  ██████╦╝██║░░██║░░░██║░░░')
time.sleep(0.1)
print(f'██║░░██║██║░╚═══██╗██║░░██╗██║░░██║██╔══██╗██║░░██║  ██╔══██╗██║░░██║░░░██║░░░')
time.sleep(0.1)
print(f'██████╔╝██║██████╔╝╚█████╔╝╚█████╔╝██║░░██║██████╔╝  ██████╦╝╚█████╔╝░░░██║░░░')
time.sleep(0.1)
print(f'╚═════╝░╚═╝╚═════╝░░╚════╝░░╚════╝░╚═╝░░╚═╝╚═════╝░  ╚═════╝░░╚════╝░░░░╚═╝░░░')
time.sleep(0.1)
print()
time.sleep(0.1)
print()
time.sleep(0.1)
print()
print(f'░█████╗░██████╗░███████╗░█████╗░████████╗░█████╗░██████╗░  ██████╗░██╗░░░██╗████████╗██╗░░██╗░█████╗░███╗░░██╗')
time.sleep(0.1)
print(f'██╔══██╗██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗  ██╔══██╗╚██╗░██╔╝╚══██╔══╝██║░░██║██╔══██╗████╗░██║')
time.sleep(0.1)
print(f'██║░░╚═╝██████╔╝█████╗░░███████║░░░██║░░░██║░░██║██████╔╝  ██████╔╝░╚████╔╝░░░░██║░░░███████║██║░░██║██╔██╗██║')
time.sleep(0.1)
print(f'██║░░╚═╝██████╔╝█████╗░░███████║░░░██║░░░██║░░██║██████╔╝  ██████╔╝░╚████╔╝░░░░██║░░░███████║██║░░██║██╔██╗██║')
time.sleep(0.1)
print(f'██║░░╚═╝██████╔╝█████╗░░███████║░░░██║░░░██║░░██║██████╔╝  ██████╔╝░╚████╔╝░░░░██║░░░███████║██║░░██║██╔██╗██║')
time.sleep(0.1)
print(f'╚█████╔╝██║░░██║███████╗██║░░██║░░░██║░░░╚█████╔╝██║░░██║  ██║░░░░░░░░██║░░░░░░██║░░░██║░░██║╚█████╔╝██║░╚███║')
time.sleep(0.1)
print(f'░╚════╝░╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝  ╚═╝░░░░░░░░╚═╝░░░░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚══╝{Fore.RESET}')
time.sleep(0.1)

print('█▄▄ █▄█   █▀█ ▄▀█ █░█ █▀▀ █░░ █▀ █▀ █▀ █▀█ █▀█')
print('█▄█ ░█░   █▀▀ █▀█ ▀▄▀ ██▄ █▄▄ ▄█ ▄█ ▄█ ▀▀█ █▄█')

create = input('Введите токен: ')
'''
@bot.event
async def on_ready():
    print('Bot ready')
    # while True:
    game = discord.Game("/help и меня писал Павел")
    await bot.change_presence(status=discord.Status.idle, activity=game)'''
with open('main.py', 'w+', encoding='utf-8') as f:
    f.write(f'import discord\nfrom discord import utils\nfrom discord.utils import get\nfrom discord.ext import commands\n\nclient = commands.Bot( command_prefix = "!")\n\n\[email protected]\nasync def on_ready():\n\tprint("Бот запущен")\n\n\n\nclient.run("{create}")')
time.sleep(1)
p = subprocess.Popen('python3 main.py')
print('Нажмите ctrl+shift для завершения работы')
def callback():
    p.terminate()
    print('Забершена работа програмы')
    keyboard.remove_hotkey('ctrl+shift')
    maincode()

keyboard.add_hotkey('ctrl+shift', callback)
def maincode():
    ch = int(input('Что вы хотите сделать?\n(1)Запустить\n(2)Выйти '))
    print(ch)
    if ch == 1:
        p = subprocess.Popen('python3 main.py')
        print('Нажмите ctrl+shift для завершения работы')
        keyboard.add_hotkey('ctrl+shift', callback)
    elif ch == 2:
        print('Досвидание. Буду рад видеть вас снова')
        sys.exit()
    else:
        maincode()

И мне в лицо прилетает ошибка

Что вы хотите сделать?
(1)Запустить
(2)Выйти Exception in thread Thread-13:
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\threading.py", line 954, in _bootstrap_inner
    self.run()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\b0tbo\AppData\Roaming\Python\Python39\site-packages\keyboard\_generic.py", line 58, in process
    if self.pre_process_event(event):
  File "C:\Users\b0tbo\AppData\Roaming\Python\Python39\site-packages\keyboard\__init__.py", line 218, in pre_process_event
    callback(event)
  File "C:\Users\b0tbo\AppData\Roaming\Python\Python39\site-packages\keyboard\__init__.py", line 649, in <lambda>
    handler = lambda e: (event_type == KEY_DOWN and e.event_type == KEY_UP and e.scan_code in _logically_pressed_keys) or (event_type == e.event_type and callback())
  File "C:/Users/b0tbo/Desktop/bot creator/app.py", line 64, in callback
    maincode()
  File "C:/Users/b0tbo/Desktop/bot creator/app.py", line 69, in maincode
    ch = int(input('Что вы хотите сделать?\n(1)Запустить\n(2)Выйти '))
ValueError: invalid literal for int() with base 10: ''

Я понимаю что она значит но никак не пойму как её решить

Попробуйте так сделать:
<code>
input_data = input('Что вы хотите сделать?\n(1)Запустить\n(2)Выйти ')
if (input_data.isdigit()):
    command = int(input_data)
    if command == 1:
        pass
    elif command == 2:
        pass
</code>
Ошибка значит данные не являются числом.


Вывод предыдущей строки

f = open('text.txt','r')
for line in f:
 print(line)

Открываю файл таким образом, перебирая строки одна за одной
как можно вывести текущую строку + прошлую строку
что то типа:

print(line[i],line[i-1])

Еcть такой вариант:

prev = "\n"
with open('text.txt','r') as f:
    for line in f:
        print("previous: ", prev, "current: ", line)
        prev = line

'''
previous:
 current:  my text

previous:  my text
 current:  it's also

previous:  it's also
 current:  it's too ...

previous:  it's too ...
 current:  my tttext
'''

а еще вариант по примеру @Stanislav Volodarskiy, с итераторами:

from itertools import tee

def pairs(seq):
    it = tee(seq)
    next(it[1])
    for item in zip(*it):
        yield item

with open('text.txt','r') as f:
    for prev,line in pairs(f):
        print("previous: ", prev, "current: ", line)

# вывод такой же, только нет первой пары строчек

с учетом дополнений @Stanislav Volodarskiy получаем такую функцию:

from itertools import tee

def pairs(seq):
    it = tee(seq)
    next(it[1], None)
    return zip(*it)