嵌套函数始终一起调用

时间:2019-07-08 16:23:23

标签: python python-3.x

我有几个函数可以保存程序使用的各种全局变量。它们总是一起被调用,因此我创建了一个函数来调用它们,如下所示:

def save_reflector(rf):
    with open('reflector.txt.',mode='w') as f:
        for num in rf:
            f.write(str(num)+'\n')

def save_rotors(r1,r2,r3,rpos1,rpos2,rpos3):
    with open('rotors.txt.',mode='w') as f:
        f.write(str(rpos1)+'\n')
        for num in r1:
            f.write(str(num)+'\n')

        f.write(str(rpos2)+'\n')
        for num in r2:
            f.write(str(num)+'\n')

        f.write(str(rpos3)+'\n')
        for num in r3:
            f.write(str(num)+'\n')

def save_wiring(wr):
    with open('wiring.txt.',mode='w') as f:
        for num in wr:
            f.write(str(num)+'\n')

def save_machine(r1,r2,r3,rpos1,rpos2,rpos3,wr,rf,v = None):#use v for verbose option
    if v is not None:
        print('Saving rotors...')
        save_rotors(r1,r2,r3,rpos1,rpos2,rpos3)
        print('Saving wiring...')
        save_wiring(wr)
        print('Saving reflector')
        save_reflector(rf)
        print('Machine Successfully saved')
    else:
        save_rotors(r1,r2,r3,rpos1,rpos2,rpos3)
        save_wiring(wr)
        save_reflector(rf)

因此,我总是一起调用这些函数,而不是分开调用。这就是为什么我想到只有on函数才能调用所有这些函数。但这要求我从外部函数到内部函数两次传递变量(这可能效率较低?),当我只键入所有变量时,这并不是完全必要的。但是,在我的主循环中使用save_machine()时,它看起来更好,也更Python化。

我不确定哪个更pythonic或更有效,所以任何建议都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

此群集的最终目的是提高代码的可读性和可维护性。由于您的业务流程要求将这三个功能作为易于命名的流程步骤save machine依次调用,因此将其包装在一个功能中是很有意义的。这不仅是Pythonic,而且在几乎所有应用程序中都具有相同的含义,而与语言无关。

这消除了调用程序的混乱,并减少了以后的开发在处理此步骤时出错的机会。您已将调用程序中的大约十行编码减少为仅一行(即函数调用)。

答案 1 :(得分:1)

转发输入没有错。能够将相关语句组合在一起是首先要有方法的全部要点。

通常在编写这样的代码时,我会从以下思路开始。 2个事件可能是巧合,但3个是模式。也就是说,如果您编写同一段代码两次以上,唯一改变的是输入变量,那么该是创建函数的时候了。

让我们以代码for num in rf: ...开头。我到处都能看到。让我们将该逻辑移至其自己的方法:

def write_r(f, r):
    for num in r:
        f.write(str(num)+'\n')

def save_reflector(rf):
    with open('reflector.txt.',mode='w') as f:
        write_r(f, rf)

def save_wiring(rf):
    with open('wiring.txt.',mode='w') as f:
        write_r(f, rf)

现在只需一点点工作,就可以使save_rotors处理n对输入

def save_rotors(r_list, rpos_list):
    with open('rotors.txt.',mode='w') as f:
        with r, rpos in zip(r_list, rpos_list)
            f.write(str(rpos)+'\n')
            write_r(f, r)

您的主要方法仍然相同:

def save_machine(r1,r2,r3,rpos1,rpos2,rpos3,wr,rf,v = None):
    ...
    save_rotors([r1,r2,r3],[rpos1,rpos2,rpos3])
    save_wiring(wr)
    save_reflector(rf)