(抱歉标题,问题的一部分,是我缺乏对正确的关键字的知识。)查找条件
我要寻找以下问题设计:
鉴于项目的列表(具有不同的属性),这取决于出现,我想运行不同的代码是什么物品:
if len(items) == 1 and A(items[0]):
return X(items)
elif len(items) == 1 and B(items[0]):
return Y(items)
elif len(items) == 2 and C(items) and D(items):
return Z(items)
else:
raise NotImplementedError
(A, B, C, D
可以简单的像评估项目的类型,但它可以需要递归评估一个表达式(例如。是items[0] = Expression("((x + y) - z)") is a string or a number?
))。
到目前为止,我使用elif
,其中吨。但是,正如您已经观察到的那样,有多次重复的条件,并且代码难以阅读。
我尝试的第二件事是将第二个条件与第一个条件分开,
if len(items) == 1:
if A(items[0]):
return X(items)
elif B(items[0]):
return Y(items)
...
然而,即使是对于决策非常翔实一定条件下(如len(items) == 1
),因此,应使他们在最外面的情况,他们可以从项目的非常不同的领域(如UI代码和后端代码)。
我怀疑我需要命名每个条件,并与他们构建一种树,但我没有找到正确的关键字搜索谷歌和SO。
这种类型的问题是如何解决的?
编辑:背景:我正在实现这个来解释脚本语言。基本上,当解释者遇到一个表达式时,例如“x + y”或“x * y”或“call z”,我需要将其转换为其他语言的相应操作。具体操作取决于变量的类型(例如,如果x
和y
是字符串或数字)和参数的数量(例如默认参数)。在大多数情况下,只有在执行时才知道类型(例如,如果x
本身就是一个表达式,在这种情况下,我使用递归来评估它)。功能的数量也很大,因此需要大量的elif
。
是'A(项[0])'一些功能或'A() '只是为了检查'items [0]'的类型? –
另外,C(项目)和D(项目)是否正确,或者你的意思是C(项目[0])和D(项目[1])? –
@MoinuddinQuadri,对不起,我只是编辑了这个问题来澄清。不,A可以像递归评估表达式并确定其类型那样更复杂。 –