Я думаю, что меня как-то заблокировали ... Я продолжал думать, как сохранить имя переменной (например, L1
) и передать его как переменную другой функции.
@ forward87: Ваше первое предложение уже разблокировало меня, и я понял, что **data
можно обработать просто через словарь. Итак, в конце концов, мне просто нужно было преобразовать входной dict в список dicts для следующей функции, например, так (с некоторыми несущественными частями, отсекаемыми):
def propagate_parallel(RTs, cav_data, **ddata):
keys = list(ddata.keys())
values = list(ddata.values())
futures = []
res = []
with confu.ProcessPoolExecutor(max_workers=32) as pool:
for i in it.product(*values):
futures.append(pool.submit(propagate, RTs=RTs,
cav_data=cav_data,
**dict(zip(keys, list(i)))))
for fut in futures:
res.append(fut)
return res
Я, наконец, понимаю **kwargs
, и что это может быть как диктат. Спасибо!
Если Вы хотите поймать все катастрофические отказы, необходимо сделать больше, чем просто: SetUnhandledExceptionFilter
Я также установил бы обработчик аварийных прекращений работы, purecall обработчик, неожиданный, оконечный обработчик, и недопустимых параметров.
#include <signal.h>
inline void signal_handler(int)
{
terminator();
}
inline void terminator()
{
int*z = 0; *z=13;
}
inline void __cdecl invalid_parameter_handler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t)
{
terminator();
}
И в Вашем основном помещает это:
signal(SIGABRT, signal_handler);
_set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT);
set_terminate( &terminator );
set_unexpected( &terminator );
_set_purecall_handler( &terminator );
_set_invalid_parameter_handler( &invalid_parameter_handler );
Вышеупомянутое отправит все катастрофические отказы на Ваш обработчик необработанных исключений.
Попытайтесь определить оскорбление, чистое виртуальный. Нет ничего в правилах C++, которые мешают Вам определять чистое виртуальное, и можно использовать это по ряду причин, наименьшее количество которого получает след на вызове. Единственный caviat является определением, должен быть вне объявления (virtual void bla() = 0 { }
не допустимо).
См. этот ответ здесь на вопрос, откуда “чистая виртуальная функция называет” катастрофические отказы прибывшими?.
Для помощи с отладкой этих видов проблем, в различных версиях MSVC, можно заменить purecall обработчик библиотеки времени выполнения. Вы делаете это путем предоставления собственной функции эту подпись:
int __cdecl _purecall(void)
и связывая его перед соединением библиотеки времени выполнения. Это дает ВАМ контроль того, что происходит, когда purecall обнаруживается. После того как Вы имеете контроль, можно сделать что-то более полезное, чем стандартный обработчик. У меня есть обработчик, который может обеспечить отслеживание стека того, где purecall произошел; посмотрите здесь: http://www.lenholgate.com/archives/000623.html для получения дополнительной информации.
(Обратите внимание, что можно также звонить
_set_purecall_handler()
устанавливать Ваш обработчик в некоторых версиях MSVC).
Так, в Вашем purecall обработчике сделайте свой мини-дамп.