Есть ли лучший способ получить значения, чем перебирать те же циклы? - PullRequest
1 голос
/ 08 мая 2019

Проще говоря, у меня есть список server классов, которые содержат список component классов, которые содержат список function классов. Вы видите, куда это идет.

В моей программе я хочу получить значение из каждого из классов функций, затем использовать все эти значения для друг друга, а затем добавить полученные значения обратно в классы function. Я снова и снова использую вложенные циклы.

Вот мой код:

component_subscriptions = {}

for server in self.network.servers:
    for component in server.components:
        for function in component.functions:
            component_subscriptions[function.name] = []

for server in self.network.servers:
    for component in server.components:
        for function in component.functions:
            for subscription in function.subscriptions:
                if subscription.name in component_subscriptions.keys():
                    component_subscriptions[subscription.name].append(function.publish_address)

for server in self.network.servers:
    for component in server.components:
        for function in component.functions:
            print(function.name)
            if function.name in component_subscriptions.keys():
                function.subscribers.extend(component_subscriptions[function.name])

for server in self.network.servers:
    for component in server.components:
        for function in component.functions:
            if function.name in component_subscriptions.keys():
                function.subscribers = component_subscriptions[function.name]

Есть ли способ повторного использования por, упрощающий три глубоких цикла for? Я что-то упускаю до смешного очевидного?

1 Ответ

2 голосов
/ 08 мая 2019

Прямой путь с генератором:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...