我正在编写一些片段来处理资产管理的目录路径。基本上我会提供一些参数,我想回到属于特定约定的路径。
例如,我会传递proj_name
,asset_type
,asset_name
,version
的值,等等。
asset_type1:
/projects/proj_name/assets/asset_type1/asset_name/version/filename.ext
asset_type2:
/projects/proj_name/assets/asset_type2/asset_name/version/sub_version/filename.ext
asset_type3:
/projects/proj_name/assets/asset_type3/asset_name/version/proxy/filename.ext
asset_type4:
/projects/proj_name/seq_assets/asset_type4/asset_name/version/filename.ext
路径树上有变化,具体取决于我正在处理的资产类型。 代码必须灵活,以便我可以轻松地调整具有子路径约定的潜在变化的新资产。 如果我传递不完整的参数,我应该可以选择返回默认路径(例如,如果我不提供版本或文件名)
我正在寻找一种处理这种方式的pythonic方法......到目前为止,如果我认识的树木将来很难适应,我的方法就变得难看了。
这基本上就是我在上面的例子。我最大的问题是路径约定不明确。在我的实际生产代码中,有更多潜在的分支。
def getPath(proj_name='proj_name', asset_type='asset_type1', asset_name=None, version=None, sub_version=None, proxy=False, filename=None):
# handle default values
# ...
path_args = []
path_args.append('/projects')
if asset_type == 'asset_type4':
path_args.append('seq_assets')
else:
path_args.append('assets')
path_args.append(asset_type)
path_args.append(asset_name)
path_args.append(version)
if sub_version:
path_args.append(sub_version)
if proxy:
path_args.append(proxy)
path_args.append(filename)
return os.path.join(*path_args)
答案 0 :(得分:1)
听起来你想要一个格式字符串的字典。
asset_paths = {
'type1': "/projects/{project}/assets/{type}/{name}/{version}/{filename}.{ext}",
'type2': "/projects/{project}/assets/{type}/{name}/{version}/{filename}.{ext}",
'type3': "/projects/{project}/assets/{type}/{name}/{version}/{filename}.{ext}",
'type4': "/projects/{project}/seq_assets/{type}/{name}/{version}/{filename}.{ext}"
}
def asset_path(project, type,
name='name', version='1.0', filename='filename', ext='ext',
**kwargs):
# Branching arguments
if 'sub_version' in kwargs && kwargs['sub_version']:
version = version + '/' + kwargs['sub_version']
if 'proxy' in kwargs && kwargs['proxy']:
filename = kwargs['proxy'] + '/' + filename
return asset_paths[type].format(project=project, type=type, name=name,
version=version, filename=filename, ext=ext,
**kwargs)
asset_path('prj', 'type1', 'fred', version='2.1')
# returns '/projects/prj/assets/type1/fred/2.1/filename.ext'
asset_path('prj', 'type2', 'fred', sub_version='b')
# returns '/projects/prj/assets/type2/fred/1.0/b/filename.ext'
此处,project
和type
是两个必需参数,name
,version
,filename
和ext
是具有默认值的参数,并且您可以根据需要为给定类型的格式字符串提供尽可能多的额外关键字参数。
sub_version
,如果存在且非空,则会附加到version
。proxy
,如果存在且非空,将被添加到filename
。