Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不带if语句的重写函数_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

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