python and some backend notes(ru)
108 subscribers
5 photos
1 file
192 links
Личные заметки и ссылки на статьи по python и backend вопросам, но может кому-то тоже будет интересно
Download Telegram
Реализация цикла for с помощью функции и цикла while

def for_loop(iterable, loop_body_func):
iterator = iter(iterable)
next_element_exist = True
while next_element_exist:
try:
element_from_iterator = next(iterator)
except StopIteration:
next_element_exist = False
else:
loop_body_func(element_from_iterator)

Здесь использовали конструкцию try-else. Она позволяет выполнять код, если исключения не возникло, и код был выполнен успешно.

#algoritms #iterator #exceptions
* Итерируемый объект — это что-то, что можно итерировать.
* Итератор — это сущность порождаемая функцией iter, с помощью которой происходит итерирование итерируемого объекта.
* Итератор не имеет индексов и может быть использован только один раз.
* Итератор имеет методы __next__ __iter__, а также вызывает исключение StopIteration при невозможности получения следующего элемента
* В случае, если мы передаём в iter итератор, то получаем тот же самый итератор

class InfiniteSquaring:
"""Класс обеспечивает бесконечное последовательное возведение в квадрат заданного числа."""
def __init__(self, initial_number):
# Здесь хранится промежуточное значение
self.number_to_square = initial_number

def __next__(self):
# Здесь мы обновляем значение и возвращаем результат
self.number_to_square = self.number_to_square ** 2
return self.number_to_square

def __iter__(self):
"""Этот метод позволяет при передаче объекта функции iter возвращать самого себя, тем самым в точности реализуя протокол итератора."""
return self

#iterrator #iter #next
Кэширование (мемоизация) с помощью lru_cache

import functools
import time

# кэширование до 12 различных результатов
@functools.lru_cache(maxsize=12)
def slow_func(x):
time.sleep(2) # Имитируем длительные вычисления
return x

slow_func(1) # ... ждём 2 секунды до возврата результата
slow_func(1) # результат уже кэширован - он возвращается немедленно!

slow_func(3) # ... опять ждём 2 секунды до возврата результата

#lru_cache #decorator
https://t.me/pythonbooksarchive - архив книг по python

#books
Никогда не стоит использовать f-strings для логгирования в python, такие строки будут выполняться вне зависимости от того, должна ли быть вызвана функция логгирования на текущем уровне. Стоит использовать старый формат для строк.
logger.info('Requests sent: %s success: %s errors: %s', self.request_sent, self.success, self.errors)

#logging #f_strings
Если вы хотите вызвать блокирующий метод из корутины и не заблокировать работу всего основного потока - вы можете вызвать ее в другом потоке используя AbstractEventLoop.run_in_executor(executor, func, *args):

fn = functools.partial(method, *args)
result = await loop.run_in_executor(None, fn)

#asyncio #functools
https://habr.com/ru/post/145835/ - метаклассы в python

В данной статье не показано как использовать метакласс, описанный классом, а не функцией. Вот пример:
>>> class Foo(metaclass=UpperAttrMetaclass):
... boo = 1
...
...
>>> f = Foo()
>>> f.boo
Traceback (most recent call last):
File "<input>", line 1, in <module>
f.boo
AttributeError: 'Foo' object has no attribute 'boo'
>>> f.BOO
1


#metaclass #type #object