Смущает преобразование цикла for в карту, которое дает разные результаты.Python

Программы на Python
Ответить
Anonymous
 Смущает преобразование цикла for в карту, которое дает разные результаты.

Сообщение Anonymous »

У меня есть существующая реализация функции, использующая цикл for.
Я хочу преобразовать ее в более функциональную форму с помощью операции сопоставления .
Вот моя текущая реализация. Это функция, которую я хочу преобразовать:
def _fast_scandir_3_impl_get_paths_recursive(target: str) -> list[str]:
items:list[str] = []
if os.path.isfile(target):
items.append(target)
elif os.path.isdir(target):
items.append(target)
for item in os.listdir(target):
item = os.path.join(target, item)
more_items = _fast_scandir_3_impl_get_paths_recursive(item)
items.extend(more_items)
return items

Это моя попытка преобразовать его.
def _fast_scandir_3_impl_get_paths_recursive(target: str) -> list[str]:
items:list[str] = []
if os.path.isfile(target):
items.append(target)
elif os.path.isdir(target):
items.append(target)
items.extend(
map(
_fast_scandir_3_impl_get_paths_recursive,
map(
lambda item: os.path.join(target, item),
os.listdir(target),
)
)
)
return items

Вот остальная часть кода.
def _fast_scandir_3_impl_convert_paths_to_path_tuples(paths:list[str]) -> list[tuple[str, str]]:
def path_to_tuple(path:str) -> tuple[str, str]:
if os.path.isfile(path):
return ('f', path)
elif os.path.isdir(path):
return ('d', path)

return (
list(
map(
path_to_tuple,
paths,
)
)
)

def fast_scandir_3(target:str) -> list[tuple[str, str]]:

# get all paths
paths = _fast_scandir_3_impl_get_paths_recursive(target)

# convert paths to tuple depending on type
path_tuples = _fast_scandir_3_impl_convert_paths_to_path_tuples(paths)

return path_tuples

Вывод
Исходный код:
running fast_scandir_3(example-target-directory)
results:
('d', '/home/user/work/python/example-target-directory')
('f', '/home/user/work/python/example-target-directory/example-file.txt')
('d', '/home/user/work/python/example-target-directory/example-subdir')
('f', '/home/user/work/python/example-target-directory/example-subdir/example-file-2.txt')

"Новый" код:
  • Он фактически прерывается при вызове функции _fast_scandir_3_impl_convert_paths_to_path_tuples, потому что скорее чем аргумент представляет собой один список, это набор вложенных списков.
Немного изменив код, мы можем наблюдать следующее:def fast_scandir_3(target:str) -> list[tuple[str, str]]:

# get all paths
paths = _fast_scandir_3_impl_get_paths_recursive(target)
print(paths)

Я не могу понять, почему это происходит.
Если мы сломаем функцию, поведение которой изменилось:def _fast_scandir_3_impl_get_paths_recursive(target: str) -> list[str]:
items:list[str] = []

if os.path.isfile(target):
items.append(target)

# it breaks somewhere in here:
elif os.path.isdir(target):
items.append(target)

# this appears to be fine
joined_items = list(
map(
lambda item: os.path.join(target, item),
os.listdir(target),
)
)
print(joined_items)

items.extend(
# this should produce a list
map(
_fast_scandir_3_impl_get_paths_recursive, # this function called with arg `str`
joined_items, # this is a list of str
)
)
return items

Кажется, что должно быть то же самое, но это не так.
Мы можем даже проверить, что _fast_scandir_3_impl_get_paths_recursive получает str аргументы, использующие это:
def _fast_scandir_3_impl_get_paths_recursive(target: str) -> list[str]:
assert isinstance(target, str), f'target is not str: {target}, {type(target)}'

Действительно.
Фактическая ошибка:
TypeError: stat: path should be string, bytes, os.PathLike or integer, not list


Подробнее здесь: https://stackoverflow.com/questions/792 ... nt-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»