PyLint поднимает «неуместно-поднять» в функции обработчика ошибок для shutil.rmtree (...) - PullRequest
4 голосов
/ 09 июля 2019

Контекст: Я использую shutil.rmtree(delDir, ignore_errors = False, onerror = readOnlyErrorHandler), чтобы удалить дерево каталогов, содержащее файлы только для чтения:

Раздражение: PyLint (внутри кода VS) помечает команду raise внутри моей функции readOnlyErrorHandler как

  • «Оператор поднятия не находится в предложении исключений» от pylint (misplaced-bare-повышение) .

Вопрос: Есть ли способ обойти это предупреждение, не отключая линтинг для всего файла?

def readOnlyErrorHandler(func, path, exc_info):
  import errno
  if func in (os.rmdir, os.unlink, os.remove) and exc_info[1].errno == errno.EACCES:
    print (f"Retry '{func.__name__}' after chmod 0o777 on '{path}'")
    os.chmod(path, 0o777) 
    func(path)
  else:
    # marked as 'The raise statement is not inside an except clause' 
    # by pylint(misplaced-bare-raise)
    raise  # purpose: rethrow the other errors that brought me here

Система: Windows, Python3.6.3

Тест с:

from stat import S_IREAD, S_IRGRP, S_IROTH
import os
import shutil

path = "./some/path/to/files/"

# create read only files:
os.makedirs(path, exist_ok=True) 
for fn in ["one.txt","two.txt"]:
    filename = os.path.join(path, fn)
    with open(filename, "w") as f:
        f.write("read only")
    os.chmod(filename, S_IREAD|S_IRGRP|S_IROTH)

# try to delete files
# fails: shutil.rmtree(path)
# works
shutil.rmtree(path, ignore_errors=False, onerror=readOnlyErrorHandler)

1 Ответ

1 голос
/ 09 июля 2019

у вас есть вся информация об исключении, которое произошло в exc_info.в этом случае exc_info будет выглядеть как

(
    <class 'FileNotFoundError'>, 
    FileNotFoundError(2, 'No such file or directory'), 
    <traceback object at 0x7fae2a66a0c8>
)

, поэтому вы можете либо повторно вызвать исключение с помощью

raise exc_info[1]

, либо настроить сообщение об ошибке (но сохранить типисключение):

raise exc_info[0]("exception from readOnlyErrorHandler")
...