Функции отправки на Python (PEP 443)

У меня есть код, выглядящий так:

funcs = {'one': self.one, 'two': self.two, } def dispatch(var): funcs[var]() 

Но в гораздо большей степени, чем две функции – в конце нужно несколько десятков. Я посмотрел на PEP 443 – одноразовый общий вариант, и я думаю, что это может помочь. Однако я не уверен, что это:

  1. Хорошая идея – питоническая?
  2. Как это сделать?

Изменить : Больше информации о том, что я делаю … Я получаю команды (строки), которые мне нужно проанализировать. В зависимости от того, какая команда получена, вызывается другой парсер. Первое слово команды всегда уникально и предопределено, остальное зависит от указанного первого слова. Я мог бы создать целую грамматику и сделать это таким образом, но это излишне. Примерами команды могут быть:

 servo 0 start_move head 5 0xff 0xab 0x34 ... 

2 Solutions collect form web for “Функции отправки на Python (PEP 443)”

PEP 443 предлагает способ выполнения функции перегрузки по существу в Python. В любом случае, поскольку он, как предполагается, будет включен в Python 3.4, использование его может вызвать проблемы совместимости, если пользователи с другими версиями Python попытаются использовать ваш код.

Я думаю, что ваша оригинальная версия в порядке. Как замечают комментарии, вам нужно превратить var из строки в переменную (typo?), Но помимо этого ваш метод должен легко масштабироваться.

Однако, поскольку вручную отслеживать все различные функции, и их имена могут стать утомительными после определенного момента, вы можете поэкспериментировать с созданием декоратора для автоматической записи и отслеживания имен функций и построения функции dict:

 class Functions(object): def __init__(self): self.funcs = {} def add(self, func): self.funcs[func.__name__] = func return func def dispatch(self, name, *args, **kwargs): return self.funcs[name](*args, **kwargs) a = Functions() @a.add def test(foo): return foo + 3 @a.add def hello(bar): return bar * 3 print a.dispatch('test', 6) # returns 9 print a.dispatch('hello', 6) # returns 18 

Я думаю, вы ищете что-то вроде:

 class A(object): def a(self): print 'aaa' def b(self): print 'bbb' a = A() getattr(a, 'a')() # output: aaa getattr(a, 'b')() # output: bbb 
  • Как отлаживать GAE python, gql и datastore?
  • Как опустить префикс модуля?
  • Предотвращение кэширования страниц в Google App Engine
  • Python: время жизни (область памяти) локальных переменных внутри функции
  • Выполнять команды python, переданные как строки в командной строке, используя python -c
  • Python: Zip dict с ключами
  • ndb aysnc "yield next", чтобы потреблять get_multi_async
  • Ubuntu Chrome: как читать cookie из скрипта python
  • Python - лучший язык программирования в мире.