为了账号安全,请及时绑定邮箱和手机立即绑定

不使用 if 语句覆盖函数

不使用 if 语句覆盖函数

慕哥6287543 2022-06-22 16:40:05
三个模型具有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}
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

我同意@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 loc

print(upload_location(e, "hello.txt"))

print(upload_location(es, "hello.txt"))

print(upload_location(s, "hello.txt"))


stories/1/10/cover.txt

stories/1/10/100.txt

stories/1/cover.txt

再说一遍,if 语句比上面的函数要好得多!!


查看完整回答
反对 回复 2022-06-22
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号