Передать функцию генератора / насмешки методу в устаревшем модуле - PullRequest
0 голосов
/ 15 ноября 2018

В Python у меня есть устаревший модуль Utils с методом legacy, например:

@staticmethod
def legacy(users, some_data, other_data):
    j=0
    for _ in users.keys():
        do_something([{'a': some_data[j], 'b': other_data[j]}])
        j=j+1

Я пишу новую логику, в которой существуют только users и some_data, а other_data не существует.

Я думаю о том, чтобы передать генератор / метод насмешки, чтобы я мог сделать:

Utils.legacy(users, some_data, magic)

, который устанавливает {'b': magic[j]} с учетом конкретной j.

Есть ли способ реализовать magic, используя генератор / некоторые насмешки?

Примечания:

  • прежний код не может быть изменен
  • Упомянутый выше упрощенный вопрос можно решить, передав dict размера пользователей, но я ищу более общее решение.

1 Ответ

0 голосов
/ 15 ноября 2018

Вам просто нужен класс с __getitem__ методом, который не накладывает никаких ограничений на его аргумент.

class Foo(object):
    def __getitem__(self, key):
        pass


Utils.legacy(users, some_data, Foo())

Замените pass на return foo для любого элемента-заполнителя foo, который вы хотите.

Или, если подумать, использовать collections.defaultdict.

from collections import defaultdict

Utils.legacy(users, some_data, defaultdict(lambda: None))

(Или используйте любую другую функцию с нулевым аргументом для предоставления значения по умолчанию вместо lambda: None.)

...