Наследование анонимного класса - PullRequest
5 голосов
/ 21 апреля 2011

Я строю API автоматизации Python вокруг конфигурации устройства, которая выглядит следующим образом ...

root@EX4200-24T# show interfaces ge-0/0/6 
mtu 9216;
unit 0 {
    family ethernet-switching {
        port-mode trunk;
        vlan {
            members [ v100 v101 v102 ];
        }
    }
}

root@EX4200-24T#

Я определяю классы Python для определенных действий (например, SET), а также классы для ключевых словдля действия ... Идея состоит в том, что SET будет перебирать классы ключевых слов и прикреплять объекты классов к интерфейсам.

Проблема в том, что конфигурация этого устройства довольно иерархическая ... например, еслиЕсть много экземпляров ethernet-switching, я не хочу, чтобы пользователи API использовали:

# Note that each keyword corresponds to a python class that is appended
# to an InterfaceList object behind the scenes...
SET(Interface='ge-0/0/6.0', Family='ethernet-switching', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/7.0', Family='ethernet-switching', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/8.0', Family='ethernet-switching', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])

Вместо этого я хотел бы использовать:

Family('ethernet-switching')
SET(Interface='ge-0/0/6.0', PortMode='trunk', Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/7.0', PortMode='trunk', Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/8.0', PortMode='trunk', Vlan=['v100', 'v101', 'v102'])
Family(None)
# API usage continues...

Однако,Я не могу придумать способ кодировать это в python, не прибегая к чему-то вроде этого ...

f = Family('ethernet-switching')
f.SET(Interface='ge-0/0/6.0', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
f.SET(Interface='ge-0/0/7.0', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
f.SET(Interface='ge-0/0/8.0', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])

Что не так уж плохо, пока мне не нужно SET() для наследования от нескольких классов ...например ...

ПРЕДПОЧТИТЕЛЬНЫЙ API

# Note: there could be many combinations of classes to inherit from
Family('ethernet-switching')
PortMode('trunk')
SET(Interface='ge-0/0/6.0', Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/7.0', Vlan=['v100', 'v101', 'v102'])
PortMode('access')
SET(Interface='ge-0/0/8.0', Vlan=['v100'])
SET(Interface='ge-0/0/9.0', Vlan=['v100'])
Family(None)
PortMode(None)

Есть ли питонский способ для достижения последнего примера API, который у меня есть?Если нет, можете ли вы поделиться некоторыми идеями о том, как кодировать иерархию классов?

Ответы [ 3 ]

10 голосов
/ 21 апреля 2011

Помогает ли вам что-то подобное?

from functools import partial
S=partial(SET, Family='ethernet-switching', PortMode='trunk')
S(Interface='ge-0/0/6.0', Vlan=['v100', 'v101', 'v102'])
S(Interface='ge-0/0/7.0', Vlan=['v100', 'v101', 'v102'])
S(Interface='ge-0/0/8.0', Vlan=['v100', 'v101', 'v102'])
2 голосов
/ 21 апреля 2011

Использование gnibbler functools.partial действительно элегантный подход, но если вы хотите взглянуть на истинный неявный контекстный подход, я предложил изучить детали реализации, лежащие в основе decimal.getcontext(), decimal.setcontext() и decimal.localcontext().

Документация по адресу: http://docs.python.org/py3k/library/decimal Исходный код по адресу: http://hg.python.org/cpython/file/default/Lib/decimal.py#l435

1 голос
/ 21 апреля 2011

Ну, это похоже на jQuery API выбора и фильтрации, где они используют цепочку функций:

some_set_of_data
    .filter(first_criteria)
        .filter(second_criteria)

Они также представили метод end(), который позволяет вам делать такие вещи:

some_set_of_data
    .filter(first_criteria)
        .filter(second_criteria)
            .do_something()
        .end()
        .do_something_else()

Обратите внимание, что в этом примере do_something() вызывается для данных, отфильтрованных как first_criteria, так и second_criteria, тогда как do_something_else() вызывается только для данных, отфильтрованных first_criteria.

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

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