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

pyd*_*evd 3 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()
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 5

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

正如Maxime指出的那样,您可能希望使用Qt的线程,而不是本机Python线程.特别是因为您想要在GUI对象上调用方法.Qt文档文章中的线程,事件和QObject在Qt文档中为您提供了概述(尽管从C++,而不是Python,观点).如果你使用的是a QThread而不是a threading.Thread,那么使用OO方法更常见 - 定义子类QThread并覆盖其run方法而不是定义函数,这使得你的问题没有实际意义.

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

专业单独的方法:

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

专业本地功能:

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

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

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