['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-пути).