如何创建多对多关系变量并提高代码可用性



我正在尝试创建一个通用的实用程序,用于从源到目标的文件传输。参数分为dirfilename,分别是os.path.dirname(some_file)os.path.basename(some_file)的结果。如果未指定,则默认情况下,目标文件名与源文件名相同。

创建了一个脚本,至少可以很好地满足我的第一个项目中的特定要求。但是正如您所注意到的,get_src_des方法非常重复,我想从讨厌的if中提高代码的可重用性......elif......陈述。有人有更好的主意重写此方法吗?

class FileTransfer:
    def __init__(self, ftp_dir, local_dir, ftp_filename=None, local_filename=None):
        self.ftp_dir = ftp_dir
        self.ftp_filename = ftp_filename
        self.local_dir = local_dir
        self.local_filename = local_filename
        self.ftp_dict = self.get_group(ftp_dir, ftp_filename)
        self.local_dict = self.get_group(local_dir, local_filename)
    @staticmethod
    def get_group(dir, filename):
        group = {
            "dir": dir,
            "filename": filename,
        }
        return group
    def get_src_des(self, src):
        if src == "ftp":
            dict_src = self.ftp_dict
            dict_des = self.local_dict
        elif src == "local":
            dict_src = self.local_dict
            dict_des = self.ftp_dict
        else:
            dict_src = None
            dict_des = None
        return dict_src, dict_des
    # other methods, such as download_from_src_to_des, upload_from_src_to_des, ...

是的。这是字典的经典用例。

您可以按如下方式重写代码:

class FileTransfer:
    def __init__(self, ftp_dir, local_dir, ftp_filename=None, local_filename=None):
        self.ftp_dir = ftp_dir
        self.ftp_filename = ftp_filename
        self.local_dir = local_dir
        self.local_filename = local_filename
        self.ftp_dict = self.get_group(ftp_dir, ftp_filename)
        self.local_dict = self.get_group(local_dir, local_filename)
        self.param_dict = {
            'ftp':(self.ftp_dict,self.local_dict),
            'local' : (self.local_dict,self.ftp_dict)
        }
    @staticmethod
    def get_group(dir, filename):
        group = {
            "dir": dir,
            "filename": filename,
        }
        return group
    def get_src_des(self, src):
        if src in param_dict:
           return param_dict[src]
        else:
          return (None,None)

下次,您只需在param_dict中添加另一个条目,而不是添加另一个 elif 语句

我同意这可以通过字典来完成,正如@Yakov Dan的回答所暗示的那样,但我会按如下所示对其进行编码,这不需要对class进行任何其他更改,并且更加动态。

如前所述,get_group()方法可以写得更简洁。

class FileTransfer:
    ...
    @staticmethod
    def get_group(dir, filename):
        return dict(dir=dir, filename=filename)
    def get_src_des(self, src):
        return {
            'ftp': (self.ftp_dict, self.local_dict),
            'local': (self.local_dict, self.ftp_dict)
        }.get(src, (None, None))

最新更新