Как удалить неиспользуемые параметры функции в shutil.rmtree

В этом вопросе представлен ответ о том, как удалить файлы, доступные только для чтения. Это супер эффективно, но требует наличия неиспользуемых параметров. В этом другом вопросе был задан вопрос, как сообщить Pylint о том, что несколько несмежных параметров не используются, без добавления конкретного комментария (например, с помощью _). Многие из ответов были примерно "ЗОМГ, КОТОРЫЙ ВЫ ДЕЙСТВУЕТЕ НЕПРАВИЛЬНО", поэтому я пообещал, что приведу пример, где это необходимо и вне моего контроля. Вот этот пример.

shutil.rmtree(self._temp_dir, onerror=del_rw)

def del_rw(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

"Ответ", чтобы пилинт не жаловался на action а также exc это к

shutil.rmtree(self._temp_dir, onerror=del_rw)

def del_rw(_action, name, _exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

но новый вопрос, как это сделать, не имея _action или же _exc как параметры?

1 ответ

Как обсуждалось в комментариях, вы не можете просто игнорировать action, а также exc так как rmtree передаст эти аргументы в обратный вызов. Из документации по питону:

Если onerror предоставляется, это должен быть вызываемый, который принимает три параметра: function, path, а также excinfo,

При этом у вас есть несколько вариантов:

  • Вы можете добавить к обратному вызову cb_ (см. также документ pylint), превращая вашу функцию в:

    shutil.rmtree(self._temp_dir, onerror=cb_del_rw)
    
    def cb_del_rw(action, name, exc):
        os.chmod(name, stat.S_IWRITE)
        os.remove(name)
    
  • Вы можете использовать ключевые аргументы (вы также можете использовать *args, но я считаю этот подход более читабельным):

    shutil.rmtree(self._temp_dir, onerror=del_rw)
    
    def del_rw(**kwargs):
        name = kwargs['name']
        os.chmod(name, stat.S_IWRITE)
        os.remove(name)
    
Другие вопросы по тегам