Я строю 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, который у меня есть?Если нет, можете ли вы поделиться некоторыми идеями о том, как кодировать иерархию классов?