абенобаши
amarao_san — 02.01.2010 Оставляя в стороне всякие сервисные оболочки (типа командной строки и обработки ошибок), реальный код выглядит так:from_list=frozenset(sys.argv[2:-1]) history=cPickle.load(file(argv[1])) to_move=from_list-history [sys.rename(f, argv[-1]) for f in to_move] cPickle.dump(history | to_move,file(argv[1],"w"))
Главное в этом коде (что заставляет меня хихикать от восторга - это операция to_move = from_list-history.
Это такая миленькая операция из теории множеств, которая возвращает список элементов, отсутствующий в "вычитаемом" списке. Сам вычитаемый список может быть сколь угодно большим, это не важно.
Ну и вдогонку операция history|to_move, возвращающая результат пересечения множеств. С сохранением уникальности элементов.
Заметим, это МНОГО эффективнее, чем "ручной" код вида:
[sys.rename(f, argv[-1]) for f in to_move if f not in from_list]
Причём эффективнее не потому, что большая часть кода выносится из интерпретируемого режима, а именно алгоритмической оптимизацией - если history будет исчисляться миллионами строк, то каждое 'in' бо-бо, что на Си, что на питоне.
Не, множества меня реально прут:
Список для сохранения в файл выглядит так:
return memory | (to_move - errors)
errors - set(), в который в случае ошибки делается errors.add(f)