Есть лёгкое подозрение, что в строке 36 может выпадать слэш, если аргумент old указан с концевым слэшем, а new без оного. Раз copy_tree выставлена как публичная функция, такой вариант вызова нельзя исключать.
В библиотеке общего назначения вывод в stdout (L122, L126) неуместен.
В чём преимущество select с таймаутом в L129 против time.sleep? В том, что при интерактивном выполнении прерывается по нажатию на клавишу?
Двухшаговое переименование в __exit__ оставляет окно для гонок, когда старый каталог уже уехал, а новый ещё не приехал. Более надёжно такие вещи делаются, если допустимо исходную постановку задачи «у нас есть каталог» поменять на «у нас есть симлинк на каталог». Тогда:
создаётся глубокий клон каталога из-под исходного симлинка (с хардлинками внутри);
в нём делаются необходимые изменения (с разбитием хардлинков перед тем или вместе с тем, как менять файлы);
Я джва года хочу такой модуль
Date: 2019-10-21 01:48 pm (UTC)Есть лёгкое подозрение, что в строке 36 может выпадать слэш, если аргумент
old
указан с концевым слэшем, а new без оного. Разcopy_tree
выставлена как публичная функция, такой вариант вызова нельзя исключать.В библиотеке общего назначения вывод в stdout (L122, L126) неуместен.
В чём преимущество
select
с таймаутом в L129 противtime.sleep
? В том, что при интерактивном выполнении прерывается по нажатию на клавишу?Двухшаговое переименование в
__exit__
оставляет окно для гонок, когда старый каталог уже уехал, а новый ещё не приехал. Более надёжно такие вещи делаются, если допустимо исходную постановку задачи «у нас есть каталог» поменять на «у нас есть симлинк на каталог». Тогда:Рекурсивное удаление в L157-162 можно сократить до
shutil.rmtree
, если не мешают требования обратной совместимости.