Python 不带if语句的重写函数
三种型号都有Python 不带if语句的重写函数,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,三种型号都有ImageField,它指的是一种功能,如果有if。是否有任何建议如何在没有if的情况下执行此功能 def上传位置(实例、文件名): _,扩展名=os.path.splitext(文件名) 如果是实例(例如,(故事,): 返回f'stories/{instance.id}/cover{extension}' 艾利夫·伊斯坦斯(例如,(第二集) 返回f'stories/{instance.story.id}/{instance.index}/cover{extension}' elif
ImageField
,它指的是一种功能,如果有if
。是否有任何建议如何在没有if的情况下执行此功能
def上传位置(实例、文件名):
_,扩展名=os.path.splitext(文件名)
如果是实例(例如,(故事,):
返回f'stories/{instance.id}/cover{extension}'
艾利夫·伊斯坦斯(例如,(第二集)
返回f'stories/{instance.story.id}/{instance.index}/cover{extension}'
elif isinstance(例如,(幕节,):
返回f'stories/{instance.eption.story.id}/{instance.eption.index}/{instance.id}{extension}
我同意@Dennis:if语句使代码非常可读。以下是
我在不使用if
的情况下尝试解决方案。也许有更好的方法,例如使用format
语句而不是“f-strings”,并且,正如@Dennis所建议的,可能使用type作为键
def上传位置(实例、文件名):
查找=记录([
(Story._name__,lambda实例:f'stories/{instance.id}/cover{extension}),
(插曲.uuu name_uuuu,lambda实例:f'stories/{instance.story.id}/{instance.index}/cover{extension}),
(eposodeslide.\uuuu name\uuuuu,lambda实例:f'stories/{instance.eption.story.id}/{instance.eption.index}/{instance.id}{extension})
])
_,扩展名=os.path.splitext(文件名)
loc=查找[实例.类.名称](实例)
返回位置
重复一下,if语句比上面的函数好得多
希望这有帮助
问候,
Prasanth使用字典映射您的位置?我认为您的原始代码很好;逻辑是明确的。您需要一个行为取决于类型的函数,因此您创建了一个行为取决于类型的函数。您可以分成三个不相关的函数,但是如果您希望能够以相同的方式在所有三种类型上调用它,那么您需要做的就是这样做。如果您有更多这样的重复if语句,请考虑从类型到函数的DICT。
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