Это компактный, URL-безопасный способ представления заявок между двумя сторонами. JWT широко используется для аутентификации и авторизации в веб-приложениях.
JWT — это компактный формат, который легко передавать через URL, заголовки HTTP или внутри тела запроса.
JWT содержит всю необходимую информацию для проверки подлинности, что избавляет от необходимости обращаться к базе данных при каждом запросе.
JWT может быть подписан с использованием алгоритмов HMAC или RSA, что обеспечивает целостность и подлинность данных.
Заголовок обычно содержит два поля
Тип токена (
typ), который для JWT равен "JWT".Алгоритм подписи (
alg), например, HMAC SHA256 или RSA.{
"alg": "HS256",
"typ": "JWT"
}Полезная нагрузка содержит набор заявок (claims). Заявки бывают трех типов: Registered claims (Зарегистрированные заявки): Зарезервированные ключи, такие как iss (issuer), exp (expiration time), sub (subject), и aud (audience).
Public claims (Публичные заявки): Пользовательские ключи, определенные в спецификации IANA JSON Web Token Registry или согласованные между сторонами.
Private claims (Частные заявки): Пользовательские ключи, уникальные для конкретного приложения.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}Подпись создается путем кодирования заголовка и полезной нагрузки с использованием Base64URL и их объединения. Затем применяется алгоритм, указанный в заголовке, к объединенной строке с использованием секретного ключа.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
pip install pyjwt
import jwt
import datetime
# Секретный ключ
secret_key = "your-256-bit-secret"
# Заголовок
header = {
"alg": "HS256",
"typ": "JWT"
}
# Полезная нагрузка
payload = {
"sub": "1234567890",
"name": "John Doe",
"admin": True,
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30) # Время истечения действия токена
}
# Создание JWT
token = jwt.encode(payload, secret_key, algorithm="HS256", headers=header)
print(token)
import jwt
# Секретный ключ
secret_key = "your-256-bit-secret"
# Декодирование JWT
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print("Signature has expired")
except jwt.InvalidTokenError:
print("Invalid token")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
2. virtualenv: популярное расширение с дополнительными функциями для управления виртуальными окружениями.
3. conda: используется в научных вычислениях и анализе данных, управляет не только Python, но и библиотеками C/C++.
4. Poetry: создаёт и управляет зависимостями через автоматическое создание виртуальных окружений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Методы getitem, setitem и delitem являются специальными методами, которые позволяют пользовательским объектам взаимодействовать с операциями получения, установки и удаления элементов по индексу или ключу. Эти методы обеспечивают интеграцию пользовательских классов с операциями индексирования, делая их поведение аналогичным встроенным типам данных, таким как списки и словари.
Используется для получения значения элемента по индексу или ключу. Он вызывается, когда используется оператор индексирования (
obj[key]).class CustomList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
print(my_list[2]) # Вывод: 3
Используется для установки значения элемента по индексу или ключу. Он вызывается, когда используется оператор присваивания с индексированием (
obj[key] = value).class CustomList:
def __init__(self, items):
self.items = items
def __setitem__(self, index, value):
self.items[index] = value
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.items) # Вывод: [1, 2, 10, 4, 5]
Используется для удаления элемента по индексу или ключу. Он вызывается, когда используется оператор удаления с индексированием (
del obj[key]).class CustomList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4, 5]
Полный пример пользовательского класса
class CustomDict:
def __init__(self):
self.items = {}
def __getitem__(self, key):
return self.items[key]
def __setitem__(self, key, value):
self.items[key] = value
def __delitem__(self, key):
del self.items[key]
def __repr__(self):
return f"{self.items}"
# Использование
my_dict = CustomDict()
my_dict['a'] = 1
my_dict['b'] = 2
print(my_dict['a']) # Вывод: 1
print(my_dict) # Вывод: {'a': 1, 'b': 2}
del my_dict['a']
print(my_dict) # Вывод: {'b': 2}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
1. Хеш-функция преобразует ключ в индекс массива.
2. Если возникают коллизии (два ключа дают одинаковый хеш), используются методы разрешения коллизий, например, цепочки (chaining) или открытая адресация.
3. В среднем сложность доступа — O(1), но может быть хуже при большом количестве коллизий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Методы
__enter__ и exit являются частью протокола менеджера контекста. Они позволяют объектам определять поведение в контексте оператора with. Эти методы обеспечивают безопасное и автоматическое управление ресурсами, такими как файлы, сетевые соединения и другие объекты, которые требуют явного открытия и закрытия.Выполняется в начале блока
with и возвращает объект, который будет присвоен переменной, указанной после as.Выполняется в конце блока
with, независимо от того, произошло исключение или нет. Он используется для очистки и освобождения ресурсов.class ManagedResource:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True # True указывает на то, что исключение было обработано
# Использование
with ManagedResource() as resource:
print("Inside the context")
print("Outside the context")
Пример управления файлом с использованием менеджера контекста
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True
# Использование
with FileManager("example.txt", "w") as f:
f.write("Hello, World!")
print("File operation completed")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
2. Асинхронность: поддерживает async/await для обработки множества запросов одновременно.
3. Автогенерация документации: автоматически создаёт OpenAPI-спецификации и Swagger UI.
4. Удобство валидации: встроенная поддержка проверки данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤1
Наследование является мощным механизмом в ООП, но оно также может привести к ряду проблем, которые следует учитывать при проектировании и разработке программного обеспечения. Вот основные проблемы, связанные с наследованием:
Классы-наследники зависят от родительских классов. Изменения в родительских классах могут потребовать изменений в классах-наследниках. Если метод в родительском классе изменяет свою сигнатуру или поведение, все классы-наследники должны быть проверены и, возможно, изменены. Решение: Использование композиции вместо наследования, когда это возможно.
Изменения в базовом классе могут непредсказуемо повлиять на поведение классов-наследников. Добавление нового метода в базовый класс может конфликтовать с существующим методом в классе-наследнике. Решение: Ограничение изменений в базовом классе, тщательное проектирование и тестирование.
Может привести к конфликтам имен методов и атрибутов, а также к сложности разрешения порядка вызовов методов (MRO — Method Resolution Order). Если два родительских класса имеют методы с одинаковыми именами, класс-наследник может неясно указывать, какой метод использовать. Решение: Использование интерфейсов (в языках, поддерживающих интерфейсы) или композиций. В Python использовать миксины.
Классы-наследники наследуют все методы и атрибуты родительских классов, даже если они не нужны. Класс-наследник может быть перегружен ненужными методами и свойствами, которые ему не требуются. Решение: Использование композиции для включения только нужных функциональностей.
Классы-наследники могут получить доступ к защищённым (protected) и приватным (private) членам родительского класса, что может нарушить инкапсуляцию. Класс-наследник может изменить состояние родительского класса, вызывая неожиданные побочные эффекты. Решение: Строгое следование принципам инкапсуляции, использование методов доступа (геттеров и сеттеров).
class A:
def method(self):
print("Method from class A")
class B:
def method(self):
print("Method from class B")
class C(A, B):
pass
c = C()
c.method() # Вывод: Method from class A (MRO выбрал метод из класса A)
Предлагает включение объектов других классов в качестве членов, предоставляя больше гибкости и меньшую связанность по сравнению с наследованием.
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.start()
print("Car started")
car = Car()
car.start()
Могут помочь определить строгие контракты для классов-наследников без предоставления реализации.
Это классы, которые предназначены для предоставления дополнительной функциональности через множественное наследование, но они не предназначены для инстанцирования напрямую.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2🤯1
2. HTTPS: расширение HTTP, использующее шифрование через SSL/TLS для защиты передаваемых данных.
3. HTTPS обеспечивает конфиденциальность, целостность данных и аутентификацию сервера.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16😁3🤯2
Это процесс определения порядка разрешения методов (Method Resolution Order, MRO), который используется для поиска методов и атрибутов в иерархии классов при множественном наследовании.
Python использует алгоритм C3-линеаризации для определения MRO. Если иерархия классов не соответствует принципам C3-линеаризации, то линеаризация невозможна.
Конфликты возникают, когда два или более родительских класса содержат методы или атрибуты с одинаковыми именами, и порядок их разрешения не может быть однозначно определён.
Если классы в иерархии имеют несовместимые или пересекающиеся зависимости, это может сделать линеаризацию невозможной.
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
Python использует C3-линеаризацию для определения порядка разрешения методов. Этот алгоритм соблюдает порядок наследования классов, учитывая при этом принципы монотонности и консистентности.
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
class C(A):
def method(self):
print("C")
class D(B, C):
pass
d = D()
d.method() # Вывод: B
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
1. Асинхронные операции позволяют выполнять другие задачи, пока ожидается завершение медленных операций, таких как запросы к сети или доступ к файлам.
2. Async используется с await для управления асинхронным кодом.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Это специальный метод, который вызывается при создании нового экземпляра класса. В языках ООП конструкторы используются для инициализации объектов, устанавливая начальные значения атрибутов и выполняя любые необходимые действия при создании экземпляра.
Называется
__init__. Этот метод вызывается автоматически при создании нового объекта класса и используется для инициализации атрибутов объекта.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display(self):
print(f"Name: {self.name}, Age: {self.age}")
# Создание экземпляра класса Person
person1 = Person("Alice", 30)
person1.display() # Вывод: Name: Alice, Age: 30
person2 = Person("Bob", 25)
person2.display() # Вывод: Name: Bob, Age: 25
Инициализирует атрибуты объекта начальными значениями.
Может выполнять любые действия, необходимые при создании объекта (например, проверка входных данных).
Может выполнять действия по управлению ресурсами, такие как открытие файлов или подключение к базе данных.
Перегрузка конструктора не поддерживается напрямую, но можно использовать аргументы по умолчанию или конструкцию
args и kwargs для имитации перегрузки.#include <iostream>
using namespace std;
class Person {
public:
string name;
int age;
// Конструктор по умолчанию
Person() {
name = "Unknown";
age = 0;
}
// Конструктор с параметрами
Person(string n, int a) {
name = n;
age = a;
}
void display() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
Person person1;
person1.display(); // Вывод: Name: Unknown, Age: 0
Person person2("Alice", 30);
person2.display(); // Вывод: Name: Alice, Age: 30
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊1
2. Используется для отправки уведомлений, обработки данных, построения отчётов и выполнения длительных операций вне основного потока.
3. Поддерживает планирование задач и распределённую обработку через брокеры, такие как RabbitMQ или Redis.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥2
Это специальный метод, который вызывается автоматически при уничтожении объекта класса. Используются для выполнения завершающих действий, таких как освобождение ресурсов, закрытие файлов, освобождение памяти и выполнение других операций очистки перед тем, как объект будет окончательно удалён из памяти.
Определяется с помощью метода
__del__. Этот метод вызывается, когда объект становится недоступным для использования и должен быть удалён сборщиком мусора.class Person:
def __init__(self, name):
self.name = name
print(f"{self.name} is created")
def __del__(self):
print(f"{self.name} is deleted")
# Создание экземпляра класса Person
person1 = Person("Alice")
# Удаление ссылки на объект
del person1
# Пример с автоматическим вызовом деструктора при завершении программы
person2 = Person("Bob")
Используется для освобождения ресурсов, таких как память, файловые дескрипторы, сетевые соединения и другие.
Может выполнять любые завершающие действия, которые необходимо выполнить перед удалением объекта.
Помогает избежать утечек памяти и других ресурсов, обеспечивая корректное завершение работы программы.
Сборщик мусора управляет временем жизни объектов, поэтому точное время вызова деструктора не всегда определено.
Деструкторы не вызываются для объектов, участвующих в циклических ссылках. Для таких случаев рекомендуется использовать модуль
weakref.import weakref
class Node:
def __init__(self, name):
self.name = name
self.next = None
print(f"{self.name} is created")
def __del__(self):
print(f"{self.name} is deleted")
# Создание узлов
node1 = Node("Node1")
node2 = Node("Node2")
# Создание циклической ссылки
node1.next = node2
node2.next = node1
# Удаление узлов (циклическая ссылка предотвратит вызов деструкторов)
del node1
del node2
# Использование слабых ссылок для предотвращения утечек памяти
node1 = Node("Node1")
node2 = Node("Node2")
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)
# Удаление узлов (слабые ссылки позволят вызвать деструкторы)
del node1
del node2
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
1. Работает с брокерами сообщений (Redis, RabbitMQ) для передачи задач.
2. Позволяет распределять обработку задач между несколькими рабочими процессами (workers).
3. Используется для автоматизации долгих или повторяющихся операций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Методы
__len__ и abs являются специальными методами (или "магическими методами"), которые позволяют объектам классов взаимодействовать с встроенными функциями и операциями языка. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с стандартными операциями Python.Используется для определения длины объекта. Он должен возвращать количество элементов в объекте. Позволяет объектам взаимодействовать с встроенной функцией
len().class MyCollection:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
# Использование
my_collection = MyCollection([1, 2, 3, 4, 5])
print(len(my_collection)) # Вывод: 5
Используется для вычисления абсолютного значения объекта. Он должен возвращать абсолютное значение объекта. Позволяет объектам взаимодействовать с встроенной функцией
abs().class MyNumber:
def __init__(self, value):
self.value = value
def __abs__(self):
return abs(self.value)
# Использование
my_number = MyNumber(-10)
print(abs(my_number)) # Вывод: 10
Методы len и abs позволяют пользовательским объектам взаимодействовать с встроенными функциями Python, что делает их использование более интуитивно понятным и удобным.
Эти методы позволяют использовать объекты классов с функциями и операциями, предназначенными для стандартных типов данных.
Использование стандартных функций
len() и abs() для пользовательских объектов делает код более понятным и читабельным.import math
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __len__(self):
return 2 # Вектор на плоскости всегда имеет два компонента
def __abs__(self):
return math.sqrt(self.x**2 + self.y**2) # Длина (модуль) вектора
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(3, 4)
print(len(v)) # Вывод: 2
print(abs(v)) # Вывод: 5.0
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Forwarded from easyoffer
easyoffer
Backend
Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты
Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты
Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты
Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты
Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты
C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты
C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты
Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты
DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты
PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты
Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты
Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
💊2
2. Они повышают производительность за счёт параллельного выполнения задач, не блокируя основной поток.
3. Особенно полезны для приложений с большим числом одновременно обслуживаемых клиентов (например, веб-серверы).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
Методы add, mul, sub и truediv являются специальными методами (или "магическими методами"), которые позволяют объектам пользовательских классов взаимодействовать с операциями сложения, умножения, вычитания и деления соответственно. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с арифметическими операциями Python.
Используется для реализации оператора сложения (
+). Он вызывается, когда используется оператор + между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # Вывод: Vector(4, 6)
Используется для реализации оператора умножения (
*). Он вызывается, когда используется оператор * между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(1, 2)
v2 = v * 3
print(v2) # Вывод: Vector(3, 6)
Используется для реализации оператора вычитания (
-). Он вызывается, когда используется оператор - между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v1 = Vector(5, 7)
v2 = Vector(2, 3)
v3 = v1 - v2
print(v3) # Вывод: Vector(3, 4)
Используется для реализации оператора деления (
/). Он вызывается, когда используется оператор / между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(6, 8)
v2 = v / 2
print(v2) # Вывод: Vector(3.0, 4.0)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Это сокращение для передачи произвольного количества позиционных аргументов в функцию.
1. Указывается как *args в объявлении функции.
2. Позволяет обрабатывать переменное количество аргументов в виде кортежа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍8💊1
Метод
__bool__ является специальным методом, который позволяет определить, как объект будет оцениваться в логическом контексте. Этот метод должен возвращать булево значение (True или False), которое указывает на истинность или ложность объекта.Используется для реализации логического поведения объектов при использовании встроенной функции
bool() и в условиях (например, в инструкциях if и while). Если объект не имеет метода bool, Python вызывает метод len, и если len возвращает ноль, объект считается ложным.class Box:
def __init__(self, items):
self.items = items
def __bool__(self):
return bool(self.items)
def __repr__(self):
return f"Box({self.items})"
# Использование
box1 = Box([1, 2, 3])
box2 = Box([])
print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False
if box1:
print("box1 is not empty") # Вывод: box1 is not empty
if not box2:
print("box2 is empty") # Вывод: box2 is empty
Если метод bool не определён, Python использует метод len для определения логического значения объекта. Если метод len возвращает 0, объект считается ложным, в противном случае — истинным.
class Box:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
def __repr__(self):
return f"Box({self.items})"
# Использование
box1 = Box([1, 2, 3])
box2 = Box([])
print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False
if box1:
print("box1 is not empty") # Вывод: box1 is not empty
if not box2:
print("box2 is empty") # Вывод: box2 is empty
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Это способ передачи произвольного количества именованных аргументов.
1. Указывается как **kwargs в объявлении функции.
2. Аргументы передаются в виде словаря.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥6❤2🤯1💊1