Python assert - лучший способ сообщить о несуществующих файлах в списке в одну строку - PullRequest
3 голосов
/ 02 июля 2019

Фон

Я использую оператор assert, чтобы проверить, существуют ли определенные файлы в list на моем компьютере, тогда я хотел бы продолжить работу, если все эти файлы есть.Я ссылался на этот поток , поэтому я делаю что-то вроде этого:

from pathlib import Path

# The list containing several filepaths
files = ['folder/file1', 'folder/file2', 'folder/file3']

# check if all of these files are exist
assert all(Path(n).exists() for n in files)

# Do something else ...
# ...

Этот фрагмент кода работает.Если один файл не существует, программа выдаст AssertionError.

Вопрос

Теперь я хотел бы всех файлов, которые не существуют , вместо простого AssertionError.

Есть ли однострочное решение для этого?

Что я пробовал

Я пробовал следующее:

assert all(Path(n).exists() for n in files), f"file {n} not exist!"

Запуск этого кода выдаст сообщение NameError: name 'n' is not defined.

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

n из понимания не входит в область действия, где вы делаете f '{n}'

Вы можете показать все несуществующие файлы

not_exists = [f for f in files if not Path(f).exists()]
assert not not_exists, f'Files {not_exists} not exist'

Или только первый

for f in files:
  assert Path(f).exists(), f'{f} not exists'

0 голосов
/ 02 июля 2019

Как уже отмечалось в комментариях, assert является строго инструментом разработки.Вы должны использовать исключение, которое не может быть отключено для любых надлежащих проверок во время выполнения;возможно, создайте собственное исключение для этого.(Утверждения будут отключены в производственном коде при некоторых обстоятельствах.)

Во-вторых, требование сделать это в одной строке кода сомнительно.Разборчивость кода должна превосходить количество строк везде, кроме, возможно, кода, критичного по времени, где время выполнения превосходит оба.

class MissingFilesException(Exception):
   pass


missing = {x for x in files if not Path(x).exists()}
if missing:
    raise MissingFilesException(
        'Missing files: {}'.format(", ".join(missing))
0 голосов
/ 02 июля 2019

Вам нужно будет использовать цикл:

for file in files:
    assert Path(file).exists(), f"{file} does not exist!"

В Python 3.8+ вы можете сделать это в одну строку, используя оператор моржа:

assert not (missing_files := [n for n in files if not Path(n).exists()]), f"files missing: {missing_files}"
...