Я хочу преобразовать ее в более функциональную форму с помощью операции сопоставления .
Вот моя текущая реализация. Это функция, которую я хочу преобразовать:
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, потому что скорее чем аргумент представляет собой один список, это набор вложенных списков.
# 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
Мобильная версия