Наличие команды 'и' внутри списка - PullRequest
0 голосов
/ 26 ноября 2018

Я не понимаю, что этот исходный код делает в строке 3, res = [...]; Я пытался понять, тестируя в консоли python с фиктивными переменными и в том же формате синтаксиса, что и res = ['raj' / 'esh'];, это дает ошибку;при тестировании с res = ['raj' and 'esh']; я всегда возвращаю вторую строку 'esh', поэтому я запутался, зачем использовать 'и' в строке.Синтаксис p / o также смущает меня.

def _get_files(parent, p, f, extensions):
    p = Path(p)  #.relative_to(parent)
    res = [p/o for o in f if not o.startswith('.')
           and (extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)]
    return res

Аргумент p parsed - путь к файлу (строка), аргумент f parsed равен f = [o.name for o in os.scandir(path) if o.is_file()];где путь в этой строке синтаксиса - путь к файлу.Могу ли я получить какую-либо помощь в понимании строки 3?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

['raj' and 'esh'] - массив из одного элемента, единственным элементом которого является результат 'raj' и 'esh';and будет вычислять первый операнд, если он ложный, и второй операнд в противном случае.Так как первый операнд не ложный, вы получаете 'esh'.

Строка в коде не является простым массивом, это понимание - по сути это короткий способ написать циклкоторый создает массив.Общий синтаксис понимания:

[x for y in z if p]

, где y будет перебирать все элементы итерируемого z, проверять, истинно ли p, и, если это так, добавить x крезультат.В вашем случае условие (p) равно

not o.startswith('.')
and
(extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)

Для каждого элемента o из f (предположительно, итерация имен файлов), если этот критерий истинен, список результатов получитэлемент, который состоит из конкатенации пути p с именем файла o (/ является естественным, хотя и удивительным на первый взгляд оператором конкатенации путей).

Проблема усугубляетсяплохое наименование выставлено во фрагменте.Рассмотрим это переписывание:

def _hidden(filename):
    return filename.startswith('.')

def _extension(filename):
    return '.' + filename.split(".")[-1].lower()

def _extension_ok(filename, allowed_extensions=None):
    return allowed_extensions is None
           or _extension(filename) in allowed_extensions

def _get_files(parent, path, filenames, allowed_extensions=None):
    path = Path(path)
    good_paths = [path/filename for filename in filenames
                  if not _hidden(filename)
                     and _extension_ok(filename, allowed_extensions)]
    return good_paths

Теперь это читается почти как на английском, и очень ясно о том, что он делает (единственный хитрый бит это path/filename, и почти любой может догадаться, что это может быть просто по аналогиив UNIX-пути).

0 голосов
/ 26 ноября 2018

Это понимание списка .

res = [p/o for o in f if not o.startswith('.')
       and (extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)]

Синтаксическая стенография для

res = []
for o in f:
    if not o.startswith('.') and (extensions is None or f'.{o.split(".")[-1].lower()}' in extensions):
        res.append(p/o)
...