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会导致显著的速度减慢,所以我觉得你的建议是一个错误。