Как написать класс оболочки, который заставляет это работать?kwarg-splatting numpy array
def foo(a, b):
print a
data = np.empty(20, dtype=[('a', np.float32), ('b', np.float32)])
data = my_magic_ndarray_subclass(data)
foo(**data[0])
Некоторые более фона:
Я имел пару функций, как это, что я хотел векторизации:
def start_the_work(some_arg):
some_calculation = ...
something_else = ...
cost = some_calculation * something_else
return cost, dict(
some_calculation=some_calculation,
some_other_calculation=some_other_calculation
)
def finish_the_work(some_arg, some_calculation, some_other_calculation):
...
С намерением, что start_the_work
вызывается с кучей различные аргументы, а затем элемент с наименьшей стоимостью завершен. Многие из тех же расчетов используются обеими функциями, поэтому словарь и kwarg-splatting используется для передачи этих результатов:
def run():
best, best_cost, continuation = min(
((some_arg,) + start_the_work(some_arg)
for some_arg in [1, 2, 3, 4]),
key=lambda t: t[1] # cost
)
return finish_the_work(best, **continuation)
Один из способов я могу векторизации их следующим образом:
def start_the_work(some_arg):
some_calculation = ...
something_else = ...
cost = some_calculation * something_else
continuation = np.empty(cost.shape, dtype=[
('some_calculation', np.float32),
('some_other_calculation', np.float32)
])
continuation['some_calculation'] = some_calculation
continuation['some_other_calculation'] = some_other_calculation
return cost, continuation
Но, несмотря на то, что он выглядит как словарь, continuation
не может быть kwarg-splatted.
'Foo (* данные [0])' работает, потому что запись структурированного массива ведет себя (для целей итерации) как кортеж. – hpaulj
Какое поведение должен выполнять класс как '** kwarg'? – Eric
Кажется, ответ на этот вопрос: 'keys()' и '__getitem__' – Eric