Почему это важно
Именованные аргументы partial можно переопределять при вызове. Для обработчиков это удобные настройки по умолчанию. Позиционные аргументы, связанные в partial, работают иначе: новые позиционные аргументы добавляются к ним.
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему это важно
Равенство Counter проверяет частоты, а не одинаковый набор сохранённых ключей. Если в тесте важна структура записей, сравнивайте dict(a) и dict(b): здесь они различаются.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍1
Почему это важно
Если сохранить метод как callback, последующая замена метода класса не обновит этот callback. При необходимости использовать текущую реализацию обращайтесь к методу непосредственно перед вызовом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему это важно
Чистый объект пути не доказывает, что разные записи ведут к одному файлу. Для разрешения реального пути есть Path(...).resolve(), который обращается к файловой системе; у PurePosixPath такого метода нет.
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему это важно
mode может вернуть одного лидера даже при ничьей. Если результат голосования должен явно показывать ничью, используйте multimode и проверяйте, сколько лидеров вернулось.
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему это важно
При разборе текста способ разделения определяет границы записей. Проверяйте, какие управляющие символы возможны во входе: splitlines и split("\n") могут разбить один текст по-разному.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍1
Почему это важно
Для применения исходного среза используйте s[cut]. Для обхода его индексов — range(*cut.indices(len(s))). Нормализованные границы нельзя механически превратить обратно в равнозначный срез.
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему это важно
При распаковке head, sep, tail проверяйте sep. Пустой sep означает, что разделитель не найден; исходная строка при этом может оказаться в head или tail, в зависимости от выбранного метода.
Please open Telegram to view this post
VIEW IN TELEGRAM
1. В DEFAULT записано timeout="30". Секция api существует, но своих параметров у неё нет.
2. При чтении из api доступны значения DEFAULT. Поэтому первый getint берёт timeout из DEFAULT и преобразует строку "30" в целое число 30.
3. fallback используется, если параметр не найден. Явно переданное fallback=5 не переопределяет значение из DEFAULT.
4. Параметра retries нет ни в api, ни в DEFAULT. Второй getint возвращает 5. Код печатает две строки:
30
5
Если нужно изменить унаследованный timeout для api, задайте его в самой секции. fallback задаёт значение на случай отсутствия параметра. В этом примере используется стандартный ConfigParser без пользовательских преобразователей.
1. Декоратор singledispatch превращает route в функцию с несколькими реализациями. Исходная реализация зарегистрирована для object и возвращает "base". Она используется, если для типа первого аргумента не найден более подходящий обработчик.
2.
3. В route("7", 7) первый аргумент — строка. Обработчик для str не зарегистрирован, поэтому вызывается исходная реализация и возвращает "base".
4. В route(7, "7") первый аргумент имеет тип int. Здесь выбирается зарегистрированная реализация, которая возвращает "int". Поэтому print выводит base int.
У обычной функции с singledispatch выбор зависит только от типа первого аргумента. Второй аргумент передаётся выбранному обработчику, но в выборе не участвует. Имя hint здесь — обычное имя параметра.