Прямой путь с генератором:
def gen_functions(self):
for server in self.network.servers:
for component in server.components:
for function in component.functions:
yield function
for function in gen_functions(self):
component_subscriptions[function.name] = []
for function in gen_functions(self):
for subscription in function.subscriptions:
if subscription.name in component_subscriptions.keys():
component_subscriptions[subscription.name].append(function.publish_address)
...
Что касается второго цикла, я предпочитаю этот способ:
for function in gen_functions(self):
for subscription in (component_subscriptions[s.name] for s in function.subscriptions if s.name in component_subscriptions):
subscription.append(function.publish_address)
, чтобы использовать его повторно, создать другую функцию:
def iter_function_subscriptions(function):
for subscription in (component_subscriptions[s.name] for s in function.subscriptions if s.name in component_subscriptions):
yield subscription
Объедините их сейчас:
for function in gen_funtions(self):
for subscription in iter_function_subscriptions(function):
subscriptoin.append(function.publish_address)
Готово, но вы можете добавить их в класс функций.
# patching the class. it will be better if you can directly add this method into function class
type(function).iter_subscriptions = iter_function_subscriptions
Затем,
for function in gen_funtions(self):
for subscription in function.iter_subscriptions():
subscription.append(function.publish_address)