Skip to main content
 首页 » 编程设计

python之如何消除python init函数中的以下代码重复

2025年01月19日15mq0036

我是编程新手。我在一个类中创建了以下函数。我注意到我在重复我的代码。我正在寻找消除这种重复的最佳解决方案。

我的类(class)有以下功能:

def init(self): 
    if not os.path.exists(self.src_flag): 
        if os.path.exists(self.src): 
            removeFolder(self.src) 
        print 'File {0} does not exist'.format(self.src_flag) 
        open(self.src_flag, 'a').close() 
 
    if not os.path.exists(self.dst_flag): 
        if os.path.exists(self.dst): 
            removeFolder(self.dst) 
        print 'File {0} does not exist'.format(self.dst_flag) 
        open(self.dst_flag, 'a').close() 

然后我调用这个函数

Folder.init() 

不确定这是否是最好的方法,但我正在考虑将函数更改为以下内容:

def init(self, flag, path): 
    if not os.path.exists(flag): 
        if os.path.exists(path): 
            removeFolder(path) 
        print 'File {0} does not exist'.format(flag) 
        open(flag, 'a').close() 

但是我必须运行函数两次才能为 src 和 dst 执行它,例如

Folder.init('C:\src\flag.txt', 'C:\src') 
Folder.init('C:\dst\flag.txt', 'C:\dst') 

谁能告诉我我的解决方案是否可行,或者是否有更好的方法?

请您参考如下方法:

当您执行完全相同的代码块时,您显然应该使用循环。唯一的问题是如何获取参数,您可以通过几种方式做到这一点并选择最适合您的方式:

  1. 只需传递 2 个列表:一个用于路径,一个用于相应的标志。现在您可以使用 zip 遍历它们:

    def init(self, flags, paths): 
        for flag, path in zip(flags, paths): 
            # your block with flag and path 
    

    你可以这样调用它:

    Folder.init(['C:\src\flag.txt', 'C:\dst\flag.txt'], ['C:\src', 'C:\dst'])

  2. 或者,传递已配对的 flagpath 的列表:

    def init(self, pairs): 
        for flag, path in pairs: 
            # your block with flag and path 
    

    你可以这样调用它:

    Folder.init([('C:\src\flag.txt', 'C:\src'), ('C:\dst\flag.txt', 'C:\dst') ])

  3. 只需将所有参数一起传递,假设它们是成对排列的。然后,迭代对:

    def init(self, *args): 
        for i in range(0, len(args)-1, 2): 
            flag = args[i] 
            path = args[i+1] 
            # your block with flag and path 
    

    或者,再次使用 zip:

    for flag, path in zip(args[::2], args[1::2]): 
        # your block with flag and path 
    

    你可以这样调用它:Folder.init('C:\src\flag.txt', 'C:\src', 'C:\dst\flag.txt', 'C:\dst ')

  4. 最后,您没有在问题中提到这一点,但假设 path 是文件 flag 的目录,您可以使用 os.path模块,只需传递标志并使用 dirname 获取 path功能:

    def init(self, *flags): 
        for flag in flags: 
            path = os.path.dirname(flag) 
            # your block with flag and path 
    

    你可以这样调用它:Folder.init('C:\src\flag.txt', 'C:\dst\flag.txt')