Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建多对多关系变量并提高代码可用性?_Python - Fatal编程技术网

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

Python 如何创建多对多关系变量并提高代码可用性?,python,Python,我正在尝试创建一个通用实用程序,用于从源到目标的文件传输。参数被分为dir和filename,这分别是os.path.dirname(某些_文件)和os.path.basename(某些_文件)的结果。如果未指定,默认情况下,目标文件名与源文件名相同 在我的第一个项目中,我已经创建了一个脚本,它至少能够很好地满足特定的需求。但是,正如您所注意到的,get\u src\u des方法是非常重复的,我想从讨厌的if..elif。。。陈述有谁有更好的主意重写这个方法吗 class FileTransf

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

在我的第一个项目中,我已经创建了一个脚本,它至少能够很好地满足特定的需求。但是,正如您所注意到的,
get\u src\u 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)

下次,不要再添加另一个elif语句,只需在
参数中添加另一个条目
我同意这可以通过字典来完成,正如@Yakov Dan的回答所建议的那样,但我会按如下所示进行编码,这不需要对
类进行任何其他更改,而且更具动态性

如图所示,可以更简洁地编写
get\u 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))

此版本的
get\u src\u des
每次都创建dict。在
\uuuu init\uuuu
中创建一次更有效。@cco:True,但动态创建它意味着它使用实例属性的当前值,而不是创建时的值。它也不需要修改类的任何其他部分,除非动态地执行它,因为show会导致显著的速度减慢,所以我觉得你的建议是一个错误。