Инкапсуляция в WebSphere языка Jython АПИ


Как вы рассматриваете это, пожалуйста, имейте в виду, я с использованием Jython 2.1 при поставке с компанией IBM в WebSphere 7.0 (их последний и величайший). У меня нет декораторов, свойства, новые объекты стиль, или любой другой в Python функция придумана в последние десятилетия.

Проблема:

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

Вдохновленный @functools на Python 3.2 по.lru_cache и свойства в Python 2.2, я придумал:

from org.python.core import PyString, PyTuple

class Getter:

    def getter(self,attr,valid_attrs):

        if attr == 'valid_attrs': return valid_attrs
        if attr not in valid_attrs.keys(): raise AttributeError

        attr_value = None
        if type(valid_attrs[attr]) == PyString:
            function = getattr(self,valid_attrs[attr])
            attr_value = function()

        elif type(valid_attrs[attr]) == PyTuple:
            function = getattr(self,valid_attrs[attr][0])
            args = []
            kwargs = {}
            for arg in valid_attrs[attr][1:]:
                if type(arg) == PyTuple:
                    if len(arg) > 2:
                        err = ('Named argument tuple %s in %s length > 2.'
                            % (arg, self.__class__.__name__ ))
                        raise NameError(err)

                    kwargs[arg[0]] = arg[1]

                elif type(arg) == PyString:
                    args.append(arg)

                else:
                    err = ('Unknown argument in %s __getattr__ dispatch list'
                            % self.__class__.__name__ )
                    raise NameError(err)

            attr_value = function(*args,**kwargs)

        else:
            raise AttributeError

        return attr_value

class App(Getter):

    def __init__(self, name=None):

        if name:
            self.app_name = name
        else:
            print 'App instance requires name.'
            raise NameError

    def __getattr__(self,attr):

        valid_attrs = { 'app_id': ('get_app_id'),
                        'deployed_nodes': ('get_deployed_nodes'),
                        'deployed_servers': ('get_deployed_servers'),
                        }

        attr_value = Getter.getter(self,attr,valid_attrs)
        setattr(self,attr,attr_value)
        return attr_value

    def get_app_id(self):
        return AdminConfig.getid('/Deployment: %s/' % self.app_name)

    def get_deployed_node(self):
        ### ... 

    def get_deployed_servers(self):
        ### ...

Как я использую это в других классах я изменить функцию отправки дикт (valid_attrs) по мере необходимости.

Это злой злоупотребления и__getattr__? Далее, чтобы скорость выполнения кода, я больше всего переживаю ремонтопригодность. Это вызовет "ВТФ?" Или, есть ли смысл, если смотреть на ограничения языка Jython 2.1 и функции, такие как @Property, нашли в новых версиях?



1041
10
задан 16 марта 2011 в 07:03 Источник Поделиться
Комментарии
1 ответ

Я бы сказал, что называть себя.setattr от и__getattr__(self, в ) пограничное насилие само по себе.

Я предполагаю, что вы пытаетесь реализовать Lazy атрибуты, верно?

Однако в вашем случае действует атрибуты появляются постоянными и их значения константы тоже, так почему бы не установить их в класс "декларации" время?

Кроме того, в Python синтаксис для кортежа с 1 элемента (1,) не (1) что вы имеете в действительный attrs не много.

3
ответ дан 7 февраля 2012 в 09:02 Источник Поделиться