在函数内声明函数是否有良好的编程风格?

时间:2013-11-15 19:13:15

标签: python python-2.7

我在PyQT4程序中有以下代码用于click处理程序:

def click_btn_get_info(self):
    task = self.window.le_task.text()
    self.statusBar().showMessage('Getting task info...')

    def thread_routine(task_id):
        order = self.ae.get_task_info(task_id)
        if order:
            info_str = "Customer: {email}\nTitle: {title}".format(**order)
            self.window.lbl_order_info.setText(info_str)
            self.statusBar().showMessage('Done')
        else:
            self.statusBar().showMessage('Authentication: failed!')

    thread = threading.Thread(target=thread_routine, args=(task,))
    thread.start()

在函数中声明函数与线程一起使用是一个好习惯吗?

1 个答案:

答案 0 :(得分:5)

总的来说,是的,这是完全合理的。但是,创建单独方法(或者,对于顶级代码,单独的函数)的替代方法非常合理。创建Thread子类也是如此。所以,没有规则说要总是做三个中的一个;有不同的情况,每一个似乎比其他情况更合理,但这些情况之间有重叠,所以通常是一个判断调用。

正如Maxime所指出的,你可能想要使用Qt的线程,而不是本机Python线程。特别是因为您想要在GUI对象上调用方法。 Qt文档中的Qt文档文章Threads, Events and QObjects为您提供了概述(尽管来自C ++,而不是Python,观点)。如果您使用的是QThread而不是threading.Thread,则使用OO方法更为常见 - 定义QThread的子类并覆盖其run方法而不是定义一个函数,这使你的问题没有实际意义。

但是如果你坚持使用Python线程,这就是我的决定。

专业方法:

  • 您在类方法而不是函数中执行此操作,并且您要与新线程共享的唯一状态是self
  • 非平凡的代码,比嵌入的函数更长。

Pro本地功能:

  • 非常具体的信息按钮回调;没有人会想要打电话。

我可能会把它变成一种方法,但我不会抱怨别人的代码使它成为一个本地函数。

在不同的情况下 - 例如,如果线程需要访问没有业务的局部变量,或者它是一个简单的函数,我可以写为内联lambda,或者如果这是一个顶级的-level函数共享全局变量而不是共享self的方法,我会转向另一个方向。