Как передать ** kwargs в другую функцию с измененными значениями для этого ключа?

Чтобы понять, почему ваш код не работает, добавьте несколько строк для печати нескольких адресов.

short* ptr1 = (short*)(people + sizeof(Person::name));
short* ptr2 = &(people[0].birthMonth);
std::cout << "ptr1: " << ptr1 << ", ptr2: " << ptr2 << std::endl;

Вы заметите, что из-за требований к выравниванию ptr1 и ptr2 .

Дальнейшее чтение: https://en.wikipedia.org/wiki/Data_structure_alignment .

-1
задан tinux 18 January 2019 в 22:39
поделиться

2 ответа

Вы ищете итерации по декартовому произведению.

Вот способ перебрать декартову.

from itertools import product
import numpy as np

L1=np.linspace(1, 2, 2)
M5=np.linspace(16, 17, 2)
dconf = dict(data=5)
size = L1.size
loop_size = size**2

def propagate(N, data, modifiers):
    data.update(modifiers)
    out = []
    for i in range(N):
        out.append('%s : %s : %s : %s'%(i, *data.values()))
    return out

mod = (dict(L1=i, M5=j) for i, j in product(L1, M5))
m = map(propagate, np.arange(2, 2+loop_size), (dconf,)*loop_size, mod)

for outer in m:
    for inner in outer:
        print(inner)

Это вы можете адаптировать к своему коду, и если вам действительно нужно идти параллельно (со всем, что это означает с точки зрения разделения информации между ядрами), возможно, посмотрите на Dask.

Надеюсь, этого достаточно, чтобы вы пошли.

Редактировать: ваш вопрос довольно сложно определить. Ваш вопрос действительно, как просто выполнить простой «вызов функции»? Полагаю, один из ответов - просто создать функцию обтекания, что-то вроде ...

def propagate(N, data, modifiers):
    ...

def call_propagate(N, data, L1_, M5_):
    mod = ...
    m = map(...
    return m

for outer in call_propagate(1000, dconf, L1, M5)
    for inner in outer:
        print(inner)
0
ответ дан ahed87 18 January 2019 в 22:39
поделиться

Я думаю, что меня как-то заблокировали ... Я продолжал думать, как сохранить имя переменной (например, 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, и что это может быть как диктат. Спасибо!

0
ответ дан tinux 18 January 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: