Cool and Fun Python
رفتن به کانال در Telegram
Крутой и весёлый Python. Случаи из практики и не только.
نمایش بیشتر472
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
Для начала признаюсь, что не люблю однострочники. Особенно те, которые уходят за край второго 😱 монитора. Код должен быть в первую очередь читаемым и понятным. Но моржовый оператор из прошлого поста вызывал бурную активность в узких кругах. Поэтому ловите финальную версию:
from secrets import token_urlsafe
def generate_token(n=5, prefix="/"):
"""Генерирует токен с префиксом для короткого url размерностью n, исключая символы двойного прочтения."""
while (token := token_urlsafe(n)) and any(char in token for char in ("-", "_", "O", "l", "I", "0", "1",)):
pass
return f"{prefix}{token}"
Финальная версия, из прода. Ещё тёплая. Тёплых вам выходных 🫶
✍️ - беру на вооружение
🤯 - как это работает?
🎉 - пятница, время отдохнуть от кодаПраздники подходят к концу. А идеи для канала регулярно появляются 💡
Начнём пост с функции генерации уникальных токенов:
# Импортируем функцию token_urlsafe из модуля secrets
from secrets import token_urlsafe
# Определяем функцию generate_token с параметрами n и prefix, по умолчанию n=5, prefix='/'
def generate_token(n=5, prefix="/"):
"""Генерирует токен с префиксом для короткого url размерностью n без символа "-" в токене."""
# Входим в бесконечный цикл
while True:
# Генерируем случайный токен и добавляем префикс
token = f"{prefix}{token_urlsafe(n)}"
# Проверяем, содержит ли токен символ "-"
if "-" not in token:
# Если не содержит, то выходим из цикла
break
# Возвращаем значение переменной token
return token
А теперь вспомним про моржовый оператор в Python. Писал про него 🔗тут и 🔗тут.
Вспомнили? Тогда перепишем код покороче:
from secrets import token_urlsafe
def generate_token(n=5, prefix="/"):
while "-" in (token := f"{prefix}{token_urlsafe(n)}"):
pass
return token
Цикл, который ничего не делает в теле цикла, много чего делает в условии цикла.
Забирайте лайфхак в копилку 😉Продолжаем мариновать объекты Python. Начало тут
Чем же так небезопасен pickle? В первую очередь программистом, который его использует неправильно.
Ловите пример:
import pickle
res = pickle.loads(b"cos\nsystem\n(S'echo Hello world!'\ntR.")
В результате загрузки данных из строки байт в терминал отправится сообщение "Hello world!". Немного не то, для чего создавался модуль. Кстати, в переменной res будет хранится ноль, а не текст или команда.
Но почему так? Дело в том, что модуль выполняет дандер __reduce__ замаринованного объекта в процессе преобразования файла/строки в объекты Python.
import pickle
import os
class MaliciousCode:
def __reduce__(self):
# При вызове функции pickle.load() будет выполнена команда удаления всех файлов в текущей директории
return (os.system, ('rm -rf *',))
malicious_object = MaliciousCode()
with open('data.pickle', 'wb') as file:
pickle.dump(malicious_object, file)
with open('data.pickle', 'rb') as file:
loaded_object = pickle.load(file)
Отличных новогодних праздников. И не стреляйте себе в ногу 😉Добрый вечер, коллеги!
С наступившим 2024 годом. Как ваше самочувствие? Может хотите маринованных огурчиков, огуречного рассола? 🥒
Модуль pickle
Помимо всем привычного и безопасного JSON для сериализации и десериализации данных в Python есть модуль pickle, выполняющий аналогичные действия с питоновскими объектами
Важно! Модуль pickle небезопасен. Распаковывайте только те данные, которым вы доверяете.
Держите простой пример маринования трёх объектов в один файл:
import pickle
obj1 = {'name': 'Alice', 'age': 25}
obj2 = [1, 2, 3, 4, 5]
obj3 = ('a', 'b', 'c')
with open('data.pickle', 'wb') as f:
pickle.dump(obj1, f)
pickle.dump(obj2, f)
pickle.dump(obj3, f)
В результате получим бинарный data.pickle с неудобным для чтения человеком содержимым, примерно таким:
� }�(� name�� Alice�� age�K u.� � ]�(K K K K K e.� � � a�� b�� c���.
Но если спустя время нам понадобятся наши словари и списки, достаём разносолы из файла:
import pickle
with open('data.pickle', 'rb') as f:
loaded_obj1 = pickle.load(f)
loaded_obj2 = pickle.load(f)
loaded_obj3 = pickle.load(f)
print(loaded_obj1) # {'name': 'Alice', 'age': 25}
print(loaded_obj2) # [1, 2, 3, 4, 5]
print(loaded_obj3) # ('a', 'b', 'c')
Успехов в новом году. И не только в консервациях 😉Итоги голосования. Python на втором месте 🥈 Не хватило всего 30 голосов. Мы могли это сделать. Но сделаем в следующем году
А пока всех с наступающими праздниками. Да прибудет с вами любимый язык программирования ❤️
А давайте устроим новогоднее чудо и проголосуем за Python в финале битвы языков программирования 🎄❤️🔥
https://tproger.ru/articles/final-bitvy-yazykov-programmirovaniya-v-2023-godu
О Markdown и Телеграм
Если простыми словами, то Markdown превращает символы в оформление. Это язык разметки, как и HTML. Например двойное подчеркивание ➡️ __ ⬅️ до и после слова делает его курсивным. Как видите Телеграм поддерживает Markdown.
После очередного обновления в Телеграм появилась подсветка синтаксиса. Работает так:
\` \` \` Python # три открывающих апострофа и название ЯП
код
\` \` \` # три закрывающих апострофа
print('Hello world!')
Пишите свои примеры в комментариях
P.S. В прошлых статьях также улучшено форматированиеНемного Python Fun 😂🤣😂
Оживить канал. Напомнить о нём подписчикам. Заодно и админу. Чтобы за выходные подготовил свежий пост. До скорой встречи
От 🌹 лица 🌹 IT 🌹 сообщества 🌹 поздравляю 🌹 лучшую 🌹 половину 🌹 канала 🌹 с 🌹 международным 🌹 женским 🌹 днём 🌹
Поздравляем с днём рождения великодушного пожизненного диктатора - Гвидо Ван Россума 🎂
