寻找一种处理目录路径树的pythonic方法

时间:2017-11-27 21:16:26

标签: python

我正在编写一些片段来处理资产管理的目录路径。基本上我会提供一些参数,我想回到属于特定约定的路径。

例如,我会传递proj_nameasset_typeasset_nameversion的值,等等。

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)

1 个答案:

答案 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'

此处,projecttype是两个必需参数,nameversionfilenameext是具有默认值的参数,并且您可以根据需要为给定类型的格式字符串提供尽可能多的额外关键字参数。

  • sub_version,如果存在且非空,则会附加到version
  • proxy,如果存在且非空,将被添加到filename