Я хочу иметь диспетчер 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. Что я здесь делаю неправильно? Это из-за декоратора, который я использую?
Их называют, потому что вы их называете. Не делай этого; поместите вызовы в 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)
Просто не выполняйте функцию во время создания 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