Python: методы вызываются, когда используются как значения dict при создании dict

1

Я хочу иметь диспетчер dict {str: method} с методами в нем. Я хочу перебрать ключи диспетчера и вызвать значение как метод, но когда я запускаю скрипт Python, методы запускаются, как только создается dict:

from python.helper.my_client import Client

def deco_download(f):
    def f_download(*args, **kwargs):
        # some retry functionality here
        return json_data
    return f_download 

class Downloader:
    def __init__(self):
        self.attribute = 'some_value'

    @deco_download
    def download_persons(self, client, *args, **kwargs):
        return client.get_persons(*args, **kwargs)

    @deco_download
    def download_organizations(self, client, *args, **kwargs):
        return client.get_organizations(*args, **kwargs)

def run(self):
    dispatcher = {
        'person': self.download_persons(client),
        'organization': self.download_organizations(client)
    }

    for key in dispatcher:
        print("Downlading data for: {0}".format(key)
        dispatcher[key]

К сожалению, методы выполняются непосредственно, когда диспетчер dict инициализируется, прежде чем я вызову их в цикле for. Я ожидаю, что они будут вызваны в цикл for, а не во время построения dict. Что я здесь делаю неправильно? Это из-за декоратора, который я использую?

  • 0
    Пожалуйста, исправьте отступ.
  • 0
    @schwobaseggl - я не понимаю, мне кажется, что этот код с отступом. Можете быть более конкретными? РЕДАКТИРОВАТЬ: хорошо, я нашел это.
Показать ещё 1 комментарий
Теги:
python-3.x
methods
dictionary

2 ответа

5
Лучший ответ

Их называют, потому что вы их называете. Не делай этого; поместите вызовы в dict.

def run(self):
    dispatcher = {
        'person': self.download_persons,
        'organization': self.download_organizations
    }

    for key in dispatcher:
        print("Downlading data for: {0}".format(key)
        dispatcher[key](client)
  • 0
    верно, так очевидно ... спасибо
2

Просто не выполняйте функцию во время создания dict:

def run(self):
    dispatcher = {
        'person': self.download_persons,
        'organization': self.download_organizations
    }

    for key in dispatcher:
        print("Downlading data for: {0}".format(key)
        dispatcher[key](client) # execute the function here

Ещё вопросы

Сообщество Overcoder
Наверх
Меню