假设我有一个多行字符串,其中可能包含由单个文件名组成的行。我想打印字符串中的每一行,除非该行是文件名(此处定义为以' .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=
),因此可能不是太笨拙了。从用户的角度来看,line_sep
是第一个参数,这似乎有点奇怪。
哪种方法更好的设计?还有其他方法我应该考虑吗?
答案 0 :(得分:2)
你的问题不应该与Pythonic的方法有关。它与设计有关,与语言无关。如果您在这两种方法中问我,我会选择1
。但更好的实现方法是通过类中包含您的功能。在Python中,您可以这样做:
class DeepPrint(object):
def __init__(self, file_path):
DeepPrint._deep_print_helper(file_path)
@staticmethod
def _deep_print_helper(file_path):
with open(file_path) as f:
return DeepPrint._deep_print(f)
@staticmethod
def _deep_print(f):
for l in f.readlines():
if l.endswith('.txt'):
DeepPrint._deep_print_helper(l)
else:
print(l)
答案 1 :(得分:0)
您的要求可能不允许这样做,但使用str.splitlines会使事情变得不那么复杂。同样徒劳,是否有原因导致原始文件不作为递归的一部分打开(即,不是将字符串传递给def deep_print(file_path):
with open(file_path) as f:
s = f.read()
for line in [l.strip() for l in s.splitlines()]:
if line.endswith('.txt'):
deep_print(line)
else:
print(line)
,您可以传入file_path)?如果可以取消这两个约束,您可以执行以下操作:
{{1}}