哪种递归方法是更好的设计?

时间:2016-08-23 20:01:56

标签: python recursion arguments parameter-passing

假设我有一个多行字符串,其中可能包含由单个文件名组成的行。我想打印字符串中的每一行,除非该行是文件名(此处定义为以' .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)

这有一个隐含的必需参数(sfile_path但不是两者都有),但由于该函数的用户只使用一个表单(s=),因此可能不是太笨拙了。从用户的角度来看,line_sep是第一个参数,这似乎有点奇怪。

哪种方法更好的设计?还有其他方法我应该考虑吗?

2 个答案:

答案 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}}