Почему это важно
Сохранение в JSON и обратное чтение не гарантируют сохранения структуры произвольного Python-словаря. Для идентификаторов выберите один тип ключей заранее и проверяйте коллизии при преобразовании. Если нужно сохранить типы ключей, можно передать записи списком пар с явным описанием типа.
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему это важно
Именованные аргументы 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 без пользовательских преобразователей.