小编pol*_*wel的帖子

PyQt5中未处理的异常

看看下面的MWE。

import sys

from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.button = QPushButton('Bham!')
        self.setCentralWidget(self.button)
        self.button.clicked.connect(self.btnClicked)

    def btnClicked(self):
        print(sys.excepthook)
        raise Exception


#import traceback
#sys.excepthook = traceback.print_exception

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_() 
Run Code Online (Sandbox Code Playgroud)

我有很多问题。我不知道它们是否都相关(我想是的),如果它们不相关,请原谅我。

  1. 当我从终端运行以上代码时,一切都很好。该程序运行,如果我单击按钮,它将打印回溯并消失。如果我在IDE(我测试过Spyder和PyCharm)中运行它,则不会显示回溯。知道为什么吗?从本质上讲,在此处和此处的其他帖子中也提出了相同的问题。请不要将此标记为其中任何一个的重复;请继续阅读。

  2. 通过添加注释行,可以再次正确显示回溯。但是,它们还具有讨厌的副作用,即该应用程序不会再因未处理的异常而终止!我不知道为什么会这样,因为AFAIK excepthook仅打印回溯,它不能阻止程序退出。目前,救援已经为时已晚。

  3. 另外,我不了解Qt在这里如何发挥作用,因为未在插槽内引发的异常仍会像我期望的那样使应用程序崩溃。无论我是否进行更改excepthook,PyQt似乎都不会覆盖它(至少print似乎暗示了这一点)。

仅供参考,我正在将Python 3.5与PyQt 5.6配合使用,并且我知道PyQt 5.5中引入的异常处理方面的变化。如果确实是上述行为的原因,我很高兴听到一些更详细的解释。

python ide qt unhandled-exception pyqt5

5
推荐指数
1
解决办法
1346
查看次数

文档测试中稳健的相对路径

我有一个函数将文件路径作为参数。

output = process('path/to/file.txt')
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以轻松地记录这样的功能。我在源代码中的某个位置提供了一个示例输入文件,我可以将输出与我期望的内容(字符串、Python 对象,或者可能是另一个文件的内容)进行比较。

问题是我的测试中的路径必然是相对的。相对于调用脚本的工作目录。

这意味着文档字符串中的所有路径都必须知道测试套件的入口点。显然这并不理想。在更复杂的测试环境中,我可以使用__file__绝对路径,但在文档测试中,__file__不存在。

以文件形式提供刺激时通常的设置是什么?

我希望听到一些更好的解决方案,而不仅仅是“始终从同一工作目录运行测试套件”。

编辑:我想从集中的测试套件入口点运行文档测试。

import doctest
import mymodule

doctest.testmod(mymodule)
Run Code Online (Sandbox Code Playgroud)

python doctest unit-testing

5
推荐指数
1
解决办法
1040
查看次数

为什么编译的python正则表达式更慢?

在另一个SO问题中,比较了正则表达式和Python in运算符的性能.但是,接受的答案使用re.match,它只匹配字符串的开头,因此表现完全不同in.此外,我希望看到每次不重新编译RE的性能提升.

令人惊讶的是,我发现预编译的版本似乎更慢.

有什么想法吗?

我知道这里还有很多其他问题让人想知道类似的问题.他们中的大多数执行他们的方式只是因为他们没有正确地重用已编译的正则表达式.如果这也是我的问题,请解释.

from timeit import timeit
import re

pattern = 'sed'
text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod' \
       'tempor incididunt ut labore et dolore magna aliqua.'

compiled_pattern = re.compile(pattern)

def find():
    assert text.find(pattern) > -1

def re_search():
    assert re.search(pattern, text)

def re_compiled():
    assert re.search(compiled_pattern, text)

def in_find():
    assert pattern in text

print('str.find     ', timeit(find))
print('re.search    ', timeit(re_search))
print('re (compiled)', timeit(re_compiled))
print('in …
Run Code Online (Sandbox Code Playgroud)

python regex python-3.x

5
推荐指数
1
解决办法
649
查看次数