Angenommen, ich habe eine mehrzeilige Zeichenfolge, die Zeilen enthalten kann, die aus einem einzigen Dateinamen bestehen. Ich möchte jede Zeile in der Zeichenfolge drucken, es sei denn, die Zeile ist ein Dateiname (hier definiert als '.txt'). In diesem Fall möchte ich jede Zeile in dieser Datei drucken, es sei denn, die Zeile in dieser Datei ist a Dateinamen usw.Welcher rekursive Ansatz ist ein besseres Design?
Mein erster Ansatz ist eine Hilfsfunktion wie folgt zu verwenden:
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)
Aber mit nur line_sep
an die Hilfsfunktion zu übergeben es passieren zurück scheint wieder unelegant.
So habe ich versucht, einen Ansatz, der nur eine Funktion verwendet:
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)
Diese implizite erforderliches Argument hat (entweder s
oder file_path
aber nicht beide), aber da der Benutzer der Funktion nur eine Form verwenden (s=
) kann es nicht zu klucky sein. Aus der Sicht des Benutzers erscheint es auch ein wenig seltsam, dass line_sep
das erste Argument ist.
Welcher Ansatz ist ein besseres Design? Gibt es einen anderen Ansatz, den ich berücksichtigen sollte?
def deep_print(s, line_sep):
def deep_print_helper(file_path):
with open(file_path) as f:
text = f.read()
return deep_print(text, line_sep)
lines = s.split(line_sep)
for l in lines:
if l.endswith('.txt'):
deep_print_helper(l)
else:
print(l)
Ich würde mit der ersten Variante gehen - Eine Funktion sollte nicht gegenseitig ausschließende Eingänge haben, wenn Sie es helfen können. – mgilson
Da dies 6 upvotes hat, wenn Sie es als Antwort hinzufügen könnten, kann ich es akzeptieren. –