Одним из основных преимуществ Loguru является его простота использования. В отличие от стандартной библиотеки logging, которая может показаться сложной и громоздкой, Loguru предлагает простой и интуитивно понятный интерфейс. Для начала работы достаточно импортировать библиотеку и начать логирование с помощью одной строки кода:
from loguru import logger
logger.info("Привет, Loguru!")
Это позволяет значительно сократить время на настройку и сразу приступить к логированию.
Loguru предоставляет широкие возможности для настройки логирования. Вы можете легко настроить формат сообщений, уровни логирования и маршрутизацию логов. Например, вы можете отправлять логи в разные файлы в зависимости от их уровня важности:
logger.add("debug.log", level="DEBUG")
logger.add("error.log", level="ERROR")
logger.debug("Это сообщение для отладки")
logger.error("Это сообщение об ошибке")Или же отправлять их на удалённый сервер для дальнейшего анализа. Библиотека также поддерживает асинхронное логирование, что делает её отличным выбором для высоконагруженных приложений.
Помимо стандартных возможностей логирования, Loguru включает в себя множество дополнительных функций, которые делают его ещё более привлекательным. Например, библиотека поддерживает автоматическое добавление контекстной информации к логам, такую как имя функции, строка кода и т.д. Также существует возможность автоматического ротации логов, что позволяет избежать переполнения дискового пространства:
logger.add("file_{time}.log", rotation="500 MB")
logger.info("Это сообщение будет записано в новый файл при достижении лимита в 500 MB")Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1
— поддерживает разные типы данных (строки, списки, множества, хэши, sorted sets)
— умеет работать с TTL, Pub/Sub, скриптами (Lua)
— поддерживает персистентность и репликацию
— только строки и числа
— максимально простой и быстрый
— нет встроенной персистентности
— хорош для простого кэширования без сложной логики
Redis — если нужно больше, чем просто кэш (например, счётчики, очереди, блокировки)
Memcached — если важна скорость и simplicity при коротком сроке жизни данных
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3❤1
Одним из главных преимуществ Pyxel является её простота использования. Она предоставляет интуитивно понятный интерфейс и минимальный набор функций, необходимых для создания игр. Это позволяет сосредоточиться на творческом процессе, не отвлекаясь на сложные технические детали.
Pyxel поставляется с набором встроенных инструментов, которые облегчают разработку игр. Среди них: редактор спрайтов, редактор звуков и редактор карт.
Ещё одно важное преимущество Pyxel — это её кроссплатформенность. Библиотека поддерживает Windows, macOS и Linux, что позволяет разрабатывать игры на любой из этих платформ.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4❤1
from datasketch import MinHash, MinHashLSH
# Создаем "отпечатки" текстов
m1 = MinHash(num_perm=128)
m2 = MinHash(num_perm=128)
for word in ["data", "science"]: m1.update(word.encode())
for word in ["data", "analysis"]: m2.update(word.encode())
# Сравниваем (0.75 = порог схожести)
print("Схожесть:", m1.jaccard(m2)) # Результат: 0.5
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥2
import string
import itertools
def brute_force_pass(target, length):
chars = string.ascii_letters + string.digits # Символы: буквы и цифры
for attempt in itertools.product(chars, repeat=length): # Генерация комбинаций
pwd_attempt = ''.join(attempt) # Преобразование кортежа в строку
print(f"Trying: {pwd_attempt}") # Вывод текущей попытки
if pwd_attempt == target: # Проверка, совпадает ли пароль
print(f"Password found: {pwd_attempt}") # Если совпал - выводим его
return pwd_attempt
print("Password not found") # Если пароль не найден
return None
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3❤1
Для начала, давайте создадим класс, который будет представлять людей. Класс будет иметь атрибуты "имя" и "возраст". Вот пример такого класса:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Теперь, когда у нас есть класс, мы можем создать объекты на его основе. Например, давайте создадим двух людей:
person1 = Person("John", 25)
person2 = Person("Alice", 30)Чтобы поместить объекты в список, мы можем использовать метод append(). Например, чтобы создать список людей и добавить туда наших двух людей, мы можем написать следующий код:
people = []
people.append(person1)
people.append(person2)
Чтобы обратиться к объектам в списке, мы можем использовать индексы. Например, чтобы получить имя первого человека в списке people, мы можем написать следующий код:
first_person_name = people[0].name
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥2👀2🤬1
from browser_history import get_history
# Получаем историю
outputs = get_history()
# Это список кортежей (дата и время, URL)
his = outputs.histories
# Выводим историю на экран
for entry in his:
print(entry)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥1
- Скорость и компактность — бинарные данные меньше и передаются быстрее, чем JSON.
- Жёсткий контракт (IDL) — схема данных описана в .proto файле, из которого генерируются клиенты и серверы на разных языках.
- Стриминг — поддержка двунаправленных потоков (клиент - сервер), что в REST приходится эмулировать через WebSocket/SSE.
- Мульти-язычность — можно легко писать сервисы на разных языках, и они будут совместимы.
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
gRPC отлично подходит для high-performance микросервисов и real-time систем, где важны скорость и строгая типизация. REST же проще для публичных API и быстрой интеграции.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🔥1😡1
tasks = ["Купить хлеб", "Выучить Python", "Сделать проект"]
for i, task in enumerate(tasks, start=1):
print(f"{i}. {task}")
1. Купить хлеб
2. Выучить Python
3. Сделать проект
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3❤1
Функция get_close_matches() используется для поиска наиболее похожих вариантов в последовательности. Это полезно, например, при реализации системы автодополнения, где нужно предложить пользователю наиболее вероятные варианты на основе его ввода.
import difflib
words = ['кот', 'собака', 'кит', 'слон']
difflib.get_close_matches('кот', words)
['кот', 'кит'].Функция ndiff() используется для сравнения двух последовательностей и выявления различий между ними. Она возвращает генератор, который производит строки, иллюстрирующие различия между последовательностями. Это полезно, например, при сравнении версий текстовых документов.
import difflib
str1 = "кот"
str2 = "кит"
diff = difflib.ndiff(str1, str2)
print('\\n'.join(diff))
к
- о
+ и
т
Функция SequenceMatcher() является более общей и мощной функцией, чем ndiff(). Она позволяет сравнивать любые две последовательности и определять степень их сходства.
import difflib
str1 = "кот"
str2 = "кит"
match = difflib.SequenceMatcher(None, str1, str2)
print(match.ratio())
0.6666666666666666, что означает, что строки совпадают на 66.67%.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🔥1
population — последовательность, из которой надо выбрать элементы (list, tuple, string и т. д.)k — количество элементов для выборки.counts — список весов элементов (по умолчанию равновероятный выбор).rng — генератор случайных чисел (по умолчанию берется из модуля random).from random import sample
letters = ['a', 'b', 'c', 'd', 'e']
result = sample(letters, k=3)
print(result)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥1
🤔7🤨3🙈2
Функция напечатает 5 один раз, а затем выдаст ошибку, потому что дальше программа пытается вызвать "ничего" (None) как функцию
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3🔥2👀1
class MyError(Exception):
pass
raise MyError("Что-то пошло не так")— Код становится читаемее
— Ошибки легче отлавливать
— Проще отлаживать и тестировать
— Можно группировать ошибки по типу
class ValidationError(MyError):
pass
class DatabaseError(MyError):
pass
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
from itertools import zip_longest
names = ["Анна", "Борис"]
scores = [90]
for name, score in zip_longest(names, scores, fillvalue="—"):
print(name, score)
Анна 90
Борис —
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5❤1
Давайте рассмотрим пример простой чистой функции на языке Python. Предположим, у нас есть функция
double, которая удваивает переданное число:def double(number):
return number * 2
Рассмотрим теперь пример нечистой функции на языке Python. Предположим, у нас есть функция add_to_list, которая добавляет переданное значение в глобальный список:
my_list = []
def add_to_list(value):
my_list.append(value)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4❤2👌1
Forwarded from IT memer
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤣6👀4😁1💯1
python manage.py makemigrations, которая создаст файл миграции в папке migrations вашего приложения.python manage.py migrate, которая применит все необходимые изменения к базе данных. При этом Django будет автоматически отслеживать и применять новые миграции при изменениях в моделях.python manage.py makemigrations --empty, чтобы определить свои собственные изменения в базе данных.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥1
Идея простая: если один компонент падает или начинает работать медленно, остальные продолжают функционировать.
- разделение ресурсов (пулы потоков, подключения к БД, очереди) для разных компонентов
- ограничение «захвата» всех ресурсов одним зависимым сервисом
- предотвращение лавинообразных отказов
Если сервис обращается к 3 внешним API, у каждого свой пул потоков. Тогда сбой в одном API не «забьёт» все подключения и не остановит остальные запросы.
— устойчивость к локальным сбоям
— предсказуемая деградация системы (отваливается часть, а не всё)
— усложнение конфигурации и мониторинга
— необходимость балансировки ресурсов между пулами
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥2