Forwarded from Коробка с питоном
Сегодня у нас простенькая задачка, а то пятница, все отдыхать хотят, я понимаю.
Есть следующий код:
Вопрос - что вернется при вызове(ну не просто так же мы собрались, верно?) , но почему?
Ответ, как обычно, есть в документации. Возвращаемое функцией значение определяется последним выполненным return.
Вторым важным аспектом является то, что finally исполняется всегда, поэтому мы и получаем его return.
#std #задачки
Есть следующий код:
def test():
try:
return 1
finally:
return 2
Вопрос - что вернется при вызове
test()
? Все и так на этом моменте понимают, что вернётся 2 Ответ, как обычно, есть в документации. Возвращаемое функцией значение определяется последним выполненным return.
Вторым важным аспектом является то, что finally исполняется всегда, поэтому мы и получаем его return.
raise
, кстати, тоже работать не будет:def test():
try:
raise ValueError()
finally:
return 3
test() # 3
#std #задачки
Python documentation
8. Errors and Exceptions
Until now error messages haven’t been more than mentioned, but if you have tried out the examples you have probably seen some. There are (at least) two distinguishable kinds of errors: syntax error...
Forwarded from Коробка с питоном
С наступившим 2024 вас! Сегодня расскажу про dirty-equals.
Этот пакет используется для реализации более читаемых и декларативных проверок на равенство/соответствие, но в полной мере он себя раскрывает при написании тестов.
Как обычно, приведу несколько примеров:
Рекомендую заглянуть в документацию, там таких удобных штук ещё очень много! Ну и изучите исходники - написано не сложно, под капотом используется чуток метаклассов, для изучения темы - самое то!
#библиотека
Этот пакет используется для реализации более читаемых и декларативных проверок на равенство/соответствие, но в полной мере он себя раскрывает при написании тестов.
Как обычно, приведу несколько примеров:
from dirty_equals import *
>>> assert 1 == IsPositive # Всё ок, число положительное
>>> assert -2 == IsPositive # AssertionError
>>> # Проверки можно комбинировать при помощи булевой логики
>>> assert ['a', 'b', 'c'] == HasLen(3) & Contains('a') # Ок, список на 3 элемента, содержит 'a'
>>> # Есть проверка словарей
>>> assert {'a': 1, 'b': 2} == IsDict(a=1, b=2)
>>> # Словари можно проверять частично
>>> assert {'a': 1, 'b': 2, 'c': 3} == IsDict(a=1, b=2).settings(partial=True)
>>> # Или вот так
>>> assert {'a': 1, 'b': 2, 'c': 3} == IsPartialDict(a=1, b=2)
>>> Можно проверять соответствие регуляркам
>>> assert 'test@kiriha.ru' == IsStr(regex=r'^[^@]+@[^@]+\.[^@]+$')
>>> # И так далее...
Рекомендую заглянуть в документацию, там таких удобных штук ещё очень много! Ну и изучите исходники - написано не сложно, под капотом используется чуток метаклассов, для изучения темы - самое то!
#библиотека
Forwarded from Николай Хитров | Блог
Тренажер по тайпингу в Python для самых маленьких (и не только)
Для некоторых задач доступны подсказки со ссылками на документацию.
Проверить свои знания по типам сюда
Посмотреть исходный код сюда
Python Type Challenges
, очень прикольный сайт-тренажер для изучения типизации. Выбираешь тему, дописываешь необходимые куски кода и запускаешь проверку линтером. Почти как олимпиадные задачки, только полезные😁Для некоторых задач доступны подсказки со ссылками на документацию.
Проверить свои знания по типам сюда
Посмотреть исходный код сюда
Forwarded from Коробка с питоном
Если у вас есть желание понять как работает asyncio, threading или multiprocessing, либо же появились вопросы - рекомендую обратить внимание на superfastpython.com
Автор понятным языком рассказывает про доступные формы параллелизма и где какую можно применить. Для совсем начинающих он сделал "пути обучения", где раскиданы темы по каждой из форм.
Для особо искушенных автор продает книги по разным темам, но как по мне они в какой-то мере повторяют бесплатный материал, который уже есть на сайте.
Практически каждая статья сопровождается реальными примерами, которые можно самому запустить.
Все материалы на английском, но некоторые из них переводит на русский комьюнити (например цикл статей про asyncio).
#asyncio #threading #multiprocessing #статья
Автор понятным языком рассказывает про доступные формы параллелизма и где какую можно применить. Для совсем начинающих он сделал "пути обучения", где раскиданы темы по каждой из форм.
Для особо искушенных автор продает книги по разным темам, но как по мне они в какой-то мере повторяют бесплатный материал, который уже есть на сайте.
Практически каждая статья сопровождается реальными примерами, которые можно самому запустить.
Все материалы на английском, но некоторые из них переводит на русский комьюнити (например цикл статей про asyncio).
#asyncio #threading #multiprocessing #статья
Super Fast Python
Home - Super Fast Python
Master Python concurrency super fast. Learn threading, multiprocessing, and asyncio with step-by-step books and code tutorials.
Forwarded from Коробка с питоном
Создание временных файлов
В процессе написания скрипта может потребоваться создание временных файлов, которые будут удалены автоматически после завершения работы скрипта или обработки файла.
Это может быть полезно по разным причинам - при обработке больших данных (которые не вместятся в буфер) или при проведении сложных операций (например, можно создать временный файл и натравить на него ffmpeg).
Для решения этих проблем в Python есть модуль
В процессе написания скрипта может потребоваться создание временных файлов, которые будут удалены автоматически после завершения работы скрипта или обработки файла.
Это может быть полезно по разным причинам - при обработке больших данных (которые не вместятся в буфер) или при проведении сложных операций (например, можно создать временный файл и натравить на него ffmpeg).
Для решения этих проблем в Python есть модуль
tempfile
. Нас интересует 2 функции - это TemporaryFile
и NamedTemporaryFile
.TemporaryFile
позволяет создать безымянный временный файл. Вот так можно создать временный текстовой файл, открыть его на запись и чтение (за это отвечает первый аргумент "w+t"
, подробнее можно прочитать здесь):from tempfile import TemporaryFile
with TemporaryFile("w+t") as t:
t.write("Hello, boxwithpython!")
t.seek(0)
data = t.read()
NamedTemporaryFile
используется для более продвинутых сценариев, так как он создает файл с именем, поэтому мы можем получить путь к нему и использовать его для дальнейших целей:from tempfile import
NamedTemporaryFile
with NamedTemporaryFile("w+t") as t:#std
t.write("Hello, boxwithpython!")
print(t.name) # /tmp/tmpljhsktjt
Forwarded from Коробка с питоном
Про __slots__
Python, аналогично другим динамическим языкам, таким как JavaScript, предоставляет возможность манипулирования объектами в рантайме, в том числе позволяет добавлять, изменять и удалять атрибуты. Цена этого – понижение скорости доступа к атрибутам и дополнительные расходы памяти.
Такое поведение нужно не всегда. Бывают случаи, когда мы точно знаем, какие атрибуты будут у наших экземпляров классов. Или же мы хотим ограничить добавление новых атрибутов. Именно для этого и существует
Слоты задаются через атрибут
В свою очередь, память экономится из-за того, что у класса не создается
#std #slots
Python, аналогично другим динамическим языкам, таким как JavaScript, предоставляет возможность манипулирования объектами в рантайме, в том числе позволяет добавлять, изменять и удалять атрибуты. Цена этого – понижение скорости доступа к атрибутам и дополнительные расходы памяти.
Такое поведение нужно не всегда. Бывают случаи, когда мы точно знаем, какие атрибуты будут у наших экземпляров классов. Или же мы хотим ограничить добавление новых атрибутов. Именно для этого и существует
__slots__
.Слоты задаются через атрибут
__slots__
в классе:class SlotsClass:Теперь мы не можем добавлять новые атрибуты к нашим объектам. Скорость доступа к атрибутам повышается на 25-30%, потому что при доступе к ним их больше не надо вычислять.
slots = ('foo', 'bar')
>>> obj = SlotsClass()
>>> obj.foo = 5
>>> obj.foo
# 5
>>> obj.another_attribute = 'test'
Traceback (most recent call last):
File "python", line 5, in <module>
AttributeError: 'SlotsClass' object has no attribute 'another_attribute'
В свою очередь, память экономится из-за того, что у класса не создается
__dict__
, который как раз хранил атрибуты.#std #slots
Forwarded from Коробка с питоном
#python python... PYTHON 🔛 🚀
Про __slots__ Python, аналогично другим динамическим языкам, таким как JavaScript, предоставляет возможность манипулирования объектами в рантайме, в том числе позволяет добавлять, изменять и удалять атрибуты. Цена этого – понижение скорости доступа к атрибутам…
__slots__ и наследование
Важно помнить, что при попытке унаследовать класс с
Из-за этого возникает неоднозначность, какой именно слот использовать в результирующем классе.
#std #slots
Важно помнить, что при попытке унаследовать класс с
__slots__
подкласс их унаследует, но так же и создаст __dict__
для новых атрибутов:class SlotsClass:Это стандартное и понятное поведение. Чтобы избежать создания
__slots__ = ('foo', 'bar')
class ChildSlotsClass(SlotsClass):
pass
>>> obj = ChildSlotsClass()
>>> obj.__slots__
# ('foo', 'bar')
>>> obj.foo = 5
>>> obj.test = 3
>>> obj.__dict__
# {'test': 3}
__dict__
, можно снова переопределить __slots__
в подклассе:class SlotsClass:А что с множественным наследованием?
__slots__ = ('foo', 'bar')
class ChildSlotsClass(SlotsClass):
__slots__ = ('baz',)
>>> obj = ChildSlotsClass()
>>> obj.foo = 5
>>> obj.baz = 6
>>> obj.something_new = 3
AttributeError: 'ChildSlotsClass' object has no attribute 'something_new'
class ClassA:Оно не работает. Потому-что каждый класс может иметь свои собственные
__slots__ = ('foo', 'bar',)
class ClassB:
__slots__ = ('baz',)
class C(ClassA, ClassB):
pass
TypeError: multiple bases have instance lay-out conflict
__slots__
, которые могут пересекаться с другими классами, а это может привести к тому, что объекты могут быть созданы неправильно или будут иметь непредсказуемое поведение. Из-за этого возникает неоднозначность, какой именно слот использовать в результирующем классе.
#std #slots
Forwarded from DE
t = (1, 2, [3, 4])
t[2] += [5, 6]
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
Загадка
```py t = (1, 2, [3, 4]) t[2] += [5, 6] ``` Что случится в результате? #python
```py t = (1, 2, [3, 4]) t[2] += [5, 6] ``` Что случится в результате? #python
Final Results
47%
`t` принимает значение `(1, 2, [3, 4, 5, 6])`
35%
Исключение `'tuple' object does not support item assignment`
8%
Ни то, ни другое
10%
И то, и другое
Forwarded from DE
Опросы в телеге не поддерживают форматирование кода, дублирую код для проверки:
Это патология Python.
Из такого примера ты можешь сделать следующие выводы:
1️⃣ Не помещай изменяемые элементы в кортежи.
2️⃣ Составное присваивание -- не атомарная операция
3️⃣ Иногда следует изучать байт-код, чтобы понять, что происходит под капотом
Удобный ресурс для пошагового исполнения кода с визуализацией - pythontutor.com
#python #quiz #blowmymind
t = (1, 2, [3, 4])
try:
t[2] += [5, 6]
except TypeError as err:
print(err)
print(t)
Это патология Python.
Из такого примера ты можешь сделать следующие выводы:
Удобный ресурс для пошагового исполнения кода с визуализацией - pythontutor.com
#python #quiz #blowmymind
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
И в дополнение к патологии выше, есть целый репозиторий с подобными штуками - ссылка
#python #wtfpython
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - satwikkansal/wtfpython: What the f*ck Python? 😱
What the f*ck Python? 😱. Contribute to satwikkansal/wtfpython development by creating an account on GitHub.
Forwarded from DE
files.pypihosted[.]org
) походил на легитимное зеркало files.pythonhosted.org.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
Если тебе интересно заглянуть под капот Python и узнать, как устроены списки - есть отличная статья, которая начинается с достаточно простого примера и потом плавно погружает в глубины C-шной реализации списков в Python.
Автор статьи серьёзно подошёл к делу: он не только детально всё расписал, но и приложил кучу наглядных иллюстраций.
Даже если ты никогда не программировал на C, тебе будет понятен и интересен материал.
Ссылка на статью, рекомендую ознакомиться — это на самом деле увлекательно🙂
#python
Автор статьи серьёзно подошёл к делу: он не только детально всё расписал, но и приложил кучу наглядных иллюстраций.
Даже если ты никогда не программировал на C, тебе будет понятен и интересен материал.
Ссылка на статью, рекомендую ознакомиться — это на самом деле увлекательно
#python
Please open Telegram to view this post
VIEW IN TELEGRAM
Codingconfessions
Why Do Python Lists Multiply Oddly? Exploring the CPython Source Code
A look at the internals of list implementation in CPython to understand this weird quirk about them
Forwarded from DE
И ещё немного про Python.
Полезно тем, кто уже освоился с f-строками в Python и использует их для форматирования. Часто ты останавливаешься на чём-то вроде
Например, представь, что тебе нужно превратить число в строку, где оно всегда будет занимать три позиции, дополняясь нулями спереди, если это необходимо. С f-строками это сделать проще простого! Если у тебя число 5, ты получишь
Гайд от PyBites показывает, на что способны f-строки. Если ты ещё не раскрыл для себя все возможности этого удобного инструмента - бегом читать🙃
Ссылка
А ещё по f-строкам у меня была ссылка на другой хороший материал в посте
#python
Полезно тем, кто уже освоился с f-строками в Python и использует их для форматирования. Часто ты останавливаешься на чём-то вроде
f"string {variable}"
, но знаешь ли ты, что f-строки скрывают в себе гораздо больше возможностей?Например, представь, что тебе нужно превратить число в строку, где оно всегда будет занимать три позиции, дополняясь нулями спереди, если это необходимо. С f-строками это сделать проще простого! Если у тебя число 5, ты получишь
"005"
, а если 123, то останется просто "123"
.Гайд от PyBites показывает, на что способны f-строки. Если ты ещё не раскрыл для себя все возможности этого удобного инструмента - бегом читать
Ссылка
А ещё по f-строкам у меня была ссылка на другой хороший материал в посте
#python
Please open Telegram to view this post
VIEW IN TELEGRAM
Pybites
Python F-String Codes I Use Every Day - Pybites
I use f-strings every day. The irony is I also every day end up searching the Web to find the correct format to use. Until one day I thought a
Forwarded from Анализ данных (Data analysis)
За последние несколько лет статические анализаторы кода значительно оптимизировали разработку приложений. Статический анализ избавляет от необходимости отыскивать ошибки и уязвимости в системе продакшн или среде развертывания, указывая участок предполагаемого сбоя на основе типизации и других подсказок кода.
В статье мы подробно разберем несколько инструментов статического анализа с открытым ПО для Python. Посмотрим, как они работают и улучшают процесс программирования.
▪ Читать
@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Николай Крупий
import sqlite3
from functools import wraps
def create_cache_table():
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS cache (input text, output text)")
conn.commit()
conn.close()
def drop_cache_table():
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("DROP TABLE IF EXISTS cache")
conn.commit()
conn.close()
def store_in_cache(input, output):
create_cache_table()
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("INSERT INTO cache VALUES (?,?)", (input, output))
conn.commit()
conn.close()
def retrieve_from_cache(input):
create_cache_table()
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("SELECT output FROM cache WHERE input=?", (input,))
result = c.fetchone()
conn.close()
if result:
return result[0]
return None
def cache(func):
@wraps(func)
def wrapper(input):
output = retrieve_from_cache(input)
if output is not None:
print("# from cache: ", end='\t')
return output
else:
print("# new question: ", end='\t')
output = func(input)
store_in_cache(input, output)
return output
return wrapper
@cache
def get_answer(input):
ai_dict = {
"who are you" : "stupid algorithm)",
"2 + 2": '4',
}
return '\t'*3 + ai_dict.get(input, "I don't khow
🤷♂️")
def test():
drop_cache_table()
test_ai_qsts = [
"who are you",
"2 + 2",
"who are you",
"ok"
]
for q in test_ai_qsts:
print(
q, get_answer(q),
sep=' -> \n',
)
if __name__ == '__main__':
test()
@getcher полный код кэширования ответовForwarded from DataEng
100 самых популярных Python докладов
Нашел в сети подборку из 100 самых просматриваемых докладов про Python: 100 most-watched Python 2023 conference talks ordered by the number of views
Среди этих докладов популярны темы про Rust, data engineering и оптимизацию производительности.
К слову, PyCon US 2024 уже прошел, но в открытом доступе до сих пор нет докладов. Надеюсь на их скорое появление, т.к. там есть на что посмотреть.
Нашел в сети подборку из 100 самых просматриваемых докладов про Python: 100 most-watched Python 2023 conference talks ordered by the number of views
Среди этих докладов популярны темы про Rust, data engineering и оптимизацию производительности.
К слову, PyCon US 2024 уже прошел, но в открытом доступе до сих пор нет докладов. Надеюсь на их скорое появление, т.к. там есть на что посмотреть.