猿问

不使用 if 语句覆盖函数

三个模型具有ImageField指一种功能,具有if. 是否有任何建议如何在没有 if 的情况下执行此功能?


def upload_location(instance, filename):

    _, extension = os.path.splitext(filename)


    if isinstance(instance, (Story,)):

        return f'stories/{instance.id}/cover{extension}'

    elif isinstance(instance, (Episode,)):

        return f'stories/{instance.story.id}/{instance.index}/cover{extension}'

    elif isinstance(instance, (EpisodeSlide,)):

        return f'stories/{instance.episode.story.id}/{instance.episode.index}/{instance.id}{extension}



慕哥6287543
浏览 152回答 1
1回答

弑天下

我同意@Dennis:if 语句使代码非常易读。以下是我在不使用if. 也许有更好的方法,例如使用format语句而不是“f-strings”,并且正如@Dennis 建议的那样,也许使用类型作为键。def upload_location(instance, filename):    lookup = dict([        (Story.__name__, lambda instance: f'stories/{instance.id}/cover{extension}'),        (Episode.__name__, lambda instance: f'stories/{instance.story.id}/{instance.index}/cover{extension}'),        (EpisodeSlide.__name__, lambda instance: f'stories/{instance.episode.story.id}/{instance.episode.index}/{instance.id}{extension}')    ])    _, extension = os.path.splitext(filename)    loc = lookup[instance.__class__.__name__](instance)    return locprint(upload_location(e, "hello.txt"))print(upload_location(es, "hello.txt"))print(upload_location(s, "hello.txt"))stories/1/10/cover.txtstories/1/10/100.txtstories/1/cover.txt再说一遍,if 语句比上面的函数要好得多!!
随时随地看视频慕课网APP

相关分类

Python
我要回答