Предположим, у меня есть многострочная строка, которая может содержать строки, состоящие из одного имени файла. Я хочу напечатать каждую строку в строке, если строка не является именем файла (определяется здесь как «.txt»), и в этом случае я хочу напечатать каждую строку в этом файле, если строка в этом файле не является имя файла и т.д.Какой рекурсивный подход - лучший дизайн?
Мой первоначальный подход заключается в использовании вспомогательной функции следующим образом:
def deep_print_helper(file_path, line_sep):
with open(file_path) as f:
text = f.read()
return deep_print(text, line_sep)
def deep_print(s, line_sep):
lines = s.split(line_sep)
for l in lines:
if l.endswith('.txt'):
deep_print_helper(l, line_sep)
else:
print(l)
Но имея передать line_sep
в вспомогательную функцию только передать его обратно, кажется, безвкусный.
Так что я попробовал такой подход, который использует только одну функцию:
def deep_print(line_sep, s='', file_path=''):
if file_path:
with open(file_path) as f:
s = f.read()
lines = s.split(line_sep)
for l in lines:
if l.endswith('.txt'):
deep_print(line_sep, file_path=l)
else:
print(l)
Это имеет неявный необходимый аргумент (либо s
или file_path
, но не оба), но так как пользователь функции будет использовать только один вид (s=
) это может быть не слишком kludgey. Также кажется немного странным с точки зрения пользователя, что line_sep
является первым аргументом.
Какой подход является лучшим дизайном? Есть ли другой подход, который я должен рассмотреть?
Я бы пошел с первым вариантом - функция не должна иметь взаимоисключающих входов, если вы можете ей помочь. – mgilson
Так как у этого есть 6 upvotes, если вы могли бы добавить его в качестве ответа, я могу его принять. –