Используя filter
, вам понадобится только одна строка
line = filter(lambda char: char not in " ?.!/;:", line)
. Это обрабатывает строку как итерируемую и проверяет каждый символ, если lambda
возвращает True
:
>>> help(filter) Help on built-in function filter in module __builtin__: filter(...) filter(function or None, sequence) -> list, tuple, or string Return those items of sequence for which function(item) is true. If function is None, return the items that are true. If sequence is a tuple or string, return the same type, else return a list.
Поскольку вы не указали Qt::ConnectionType
, метод будет вызываться как Qt::AutoConnection
, а это означает, что он будет вызываться синхронно (как обычный вызов функции), если сродство потока объекта к текущему потоку, и асинхронно в противном случае. «Асинхронно» означает, что QEvent
создается и помещается в очередь сообщений и будет обрабатываться, когда цикл события достигнет его.
Причина использования QMetaObject::invokeMethod
, если объект-получатель может находиться в другой поток заключается в том, что попытка вызвать слот непосредственно на объект в другом потоке может привести к повреждению или ухудшению, если он обращается или изменяет данные, не содержащие потоки.
Мне нравится этот трюк:
void A:doSomethingSlot()
{
if (thread()!=QThread::currentThread()) {
QMetaObject::invokeMethod(this,"doSomethingSlot", Qt::QueuedConnection);
return;
}
// this is done always in same thread
...
emit ready();
}