Python Event-Category Mapping Design - PullRequest
       2

Python Event-Category Mapping Design

0 голосов
/ 24 мая 2011

Я работаю над некоторым кодом для организации нашего определения событий / отображения категорий. Наша цель - иметь возможность определять «имена событий», а также ассоциировать категории, это в значительной степени статичный процесс. Мы хотим, чтобы люди использовали константы, а не кучу строк везде. Нам также нужно где-то проверять события / категории, а также выполнять некоторые операции поиска, такие как получение событий по категориям и наоборот.

class EventMapping(object)
    def __init__(self, name, categories):
        self.name =  name
        self.categories=  categories
        EventRegistry.register(self)

    def __eq__(self, obj):
        if(isinstance(obj, str)):
            return obj==self.name
        if(isinstance(obj, EventMapping)):
            return obj.name ==self.name 
               and obj.categories==self.categories
        return False

    def __repr__(self):
        return self.name   

class Event():
    class MyCompontent():
        ComponentEvent = EventMapping("ComponentEvent", None)
        ComponentEventWCategory = EventMapping("ComponentEvent"
             , [Category.MyComponent.Useful])
    class Data():
         Created =EventMapping("Created", [Category.Data.All, Category.Data.Count]
         Updated= EventMapping("Updated", [Category.Data.All]
         Deleted= EventMapping("Deleted", [Category.Data.All, Category.Data.Count]

class Category():
    class MyComponent():
        Useful = "Useful"
    class Data():
        All= "All" 
        Count= "Count" 

class EventRegistry():
    @staticmethod
    def register( eventMapping):
        eventName= eventMapping.name
        #store locally...

    @staticmethod
    def events(category):
        #retreive events by category

    @staticmethod
    def category(event_name):
        #retreive categories by event name

Есть пара вещей, которые мне не нравятся:

  1. В классе EventRegistry я сохраняю их дважды, один раз в ключе словаря событий, являющемся именем, и оцениваю список категорий. Второй - это словарь противоположной категории, снабженный именем категории и списком событий. Есть ли лучший способ добиться этого? Мне нужен простой способ поиска по имени или категории.

  2. Должен ли я просто создать два реестра? Один для категорий один для событий?

  3. Когда речь идет об использовании событий, мы делаем это следующим образом:

    self.subscribe(Event.MyComponent.Useful) self.subscribe(Category.MyComponent.Useful)

затем мы используем реестр для проверки существования события, а также для доставки сообщения. Есть ли более простой способ получить пакет, такой как пространства имен?

Просто ищу отзывы о лучших способах сделать это или шаблон для подражания. Я искал вокруг и не могу ничего найти. Даже если вы знаете какой-то модуль, на который я могу взглянуть и лучше понять, как сделать это лучше, я тоже буду рад рассмотреть это.

1 Ответ

1 голос
/ 24 мая 2011

Почему бы вам не пойти на что-то более питоническое ?

from collections import defaultdict


_linked = defaultdict(set)


class Linkable(object):

    def link(self, *others):
        _linked[self].update(others)
        for each in others:
            _linked[each].add(self)

    def unlink(self, *others):
        _linked[self].difference_update(others)
        for each in others:
            _linked[each].discard(self)

    def links(self):
        return set(_linked[self])


class NameHierarchy(object):

    def __init__(self, name, parent=None):
        self.name = name
        self.parent = parent or self
        self.path = parent.path + [self] if parent else [self]

    def __str__(self):
        return '.'.join(each.name for each in self.path)

    def add(self, name):
        if name not in self.__dict__:
            setattr(self, name, self.__class__(name, self))


class LinkedNameHierarchy(Linkable, NameHierarchy):
    pass


Category = LinkedNameHierarchy('Category')

Category.add('MyComponent')
Category.MyComponent.add('Useful')

Category.add('Data')
Category.Data.add('All')
Category.Data.add('Count')

Event = LinkedNameHierarchy('Event')

Event.add('MyComponent')
Event.MyComponent.add('ComponentEvent')
Event.MyComponent.add('ComponentEventWCategory')

Event.MyComponent.ComponentEventWCategory.link(Category.MyComponent.Useful)

Event.add('Data')
Event.Data.add('Created')
Event.Data.add('Updated')
Event.Data.add('Deleted')

Event.Data.Created.link(Category.Data.All, Category.Data.Count)
Event.Data.Updated.link(Category.Data.All)
Event.Data.Deleted.link(Category.Data.All, Category.Data.Count)


def show_links():
    print
    print '----8<--------8<--------8<--------8<--------8<--------8<----'
    for k, v in sorted(_linked.iteritems(), key=lambda x:str(x[0])):
        print
        print k
        for each in sorted(v, key=str):
            print '        ', each

show_links()

Event.Data.Created.unlink(Category.Data.Count)

show_links()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...