嵌套的if语句,干净的代码,以及Pythonic,带有控制器/键盘输入

时间:2014-03-07 02:50:18

标签: python if-statement pygame

首先是背景:我使用Python和PyGame。我已经尝试编写自己的输入/控制器模块,允许用户以他们喜欢的任何方式重新映射控件。这必然要求我的代码被编写以处理不同类型的输入(例如,键盘键,控制器按钮和控制器轴/帽子/等)。

例如,如果按钮“Right”被映射到箭头键,则处理GetPush("Right")GetRelease("Right")的代码与将其映射到被推动的控制棒的情况稍有不同某个轴。为了帮助解决这个问题,我创建了一个辅助函数__GetButtonType() - 正如名称所回复的那样 - 返回它是什么类型的按钮。对于此处显示的代码,按钮称为字符串。字符串的第一个字母表示按钮类型,其余表示按钮。例如,k97指的是值为97的键盘键。 (A键。)

现在问题就在眼前。我的代码完成了我想要它做的事情。但是当我开始清理它时,我遇到了困扰我的一部分。我有以下代码段来处理来自键盘的按下。 (DoSomething()函数替换完全不相关的代码,我认为对于手头的问题并不重要。)

for n in TheController.ControlMap:
    if __GetButtonType(n)=="key":
        if event.type == KEYUP:
            if event.key == int(n[1:]): DoSomething()
        if event.type == KEYDOWN:
            if event.key == int(n[1:]): DoSomethingElse()

关于这一点看起来对我来说有点不对劲。可能是重复if event.key == int(n[1:])条件。这似乎很浪费。但是,如果event.key不是KEYUPKEYDOWN,那么该事件将没有关键属性(这就是pyGame的工作原理,这不是我的设计。)这意味着只要if (event.type == KEYDOWN and event.key == int(n[1:])是其他内容,条件event.type就会抛出错误。

然而,我想了一下,并意识到我可以通过以下方式构建它来将代码缩短一行:

for n in TheController.ControlMap:
    if event.type == KEYUP:
        if __GetButtonType(n)=="key" and event.key == int(n[1:]): DoSomething()
    if event.type == KEYDOWN:
        if __GetButtonType(n)=="key" and event.key == int(n[1:]): DoSomethingElse()

两个代码段均有效。两者都做同样的事情。第一个看起来更容易阅读,但不是很多。第二个使用较少的行。我的问题是:

哪种风格“更好”?一个人的表现是否比另一个人的表现要快不可忽略的数量?或者只是被认为是“糟糕的做法?”事实上,也许他们俩都是。我对编程还是比较新的。

谢谢,

  • 克里斯

2 个答案:

答案 0 :(得分:3)

你的两个陈述都有一个相同的功能,会让人感到畏缩。等效if语句重复两次。这不是好事,因为它会破坏您的代码,绝对没有必要:

if event.type in [KEYUP, KEYDOWN] and __GetButtonType(n)=="key" and event.key == int(n[1:]):
    if event.type == KEYUP:
        DoSomething()
    elif event.type == KEYDOWN:
        DoSomethingElse()

此处第一个条件确保您不会在event.key上收到错误。

同样使用elif因为选项是互斥的。简单的else也足够了,但为了便于阅读,我会离开elif。您也可以将其隐藏到DoSomething(event.type)


根据你问的对象,另一个看起来很难看或漂亮的选择是把它全部折成一个平面if-else:

if event.type in [KEYUP, KEYDOWN] and __GetButtonType(n)=="key" and event.key == int(n[1:]):
    (DoSomething if event.type == KEYUP else DoSomethingElse)()

但这有点奇怪......但仍然有效。


在性能方面,这里绝对没有什么值得担心的。优化是一个完整的其他主题,优化的第一件事是程序设计/算法,而不是本地低重要性命令。

答案 1 :(得分:1)

关于什么' sashkello'提到,我通常在我的pygame程序中有以下代码块。

   for event in pygame.event.get():

        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT :
               do_something()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
               do_something_else()