как запустить блок кода внутри оператора Python - PullRequest
1 голос
/ 11 сентября 2011

Я новичок в python и мне очень нравится концепция использования словарей вместо операторов switch / case, но есть одна проблема, которую я не могу понять

Допустим, у нас есть «pythonic case»выражение

{
    'a': somemethod,
    'b': othermethod
}['a']()

Это прекрасно работает, но я не могу понять, как запустить какой-то блок кода, как в других языках, таких как Java, что-то, что будет выглядеть так

{
    'a': { some commands here }
    'b': { other commands here that are executed }
}['a']

Может быть, лямбда может помочь?

Большое вам спасибо

Ответы [ 3 ]

3 голосов
/ 11 сентября 2011

Просто используйте if...elif...else.Это не так уж плохо:

    if x == 'a':
        pass
    elif x == 'b':
        pass
    elif x == 'c':
        pass
    else:
        pass
3 голосов
/ 11 сентября 2011

Значения словаря должны быть объектами некоторого вида.Это означает, что вы, по сути, должны инкапсулировать код, который хотите запустить, в функцию, определенную в другом месте.Вы могли бы играть с exec - вы могли бы создать набор строк, а затем, например, exec строку из этого фрагмента - но я бы не рекомендовал это.

lambda частично отвечает на ваш вопрос, но lambda ограничено в его применимости;среди прочих ограничений он может создавать только однострочные функции.Тем не менее, для очень простых функций это достаточно.

>>> d = {
...      'a': lambda: 5 + 5,
...      'b': lambda: 10 + 10
...     }
>>> d['a']()
10

Лучший способ сделать это с более длинными блоками кода - просто определить функцию или метод.

2 голосов
/ 11 сентября 2011

Вы должны поместить свой код в функции.Затем вы можете создать словарь функций, но в Python для вас уже есть концепция: используйте класс.

class Foo:
   def cmd_a(self): ...
   def cmd_b(self): ...
   def cmd_c(self): ...
   def default_action(self): ...
   def execute(self, cmd):
       action = getattr(self, 'cmd_'+cmd, self.default_action)
       return action()

foo = Foo()
foo.execute('a')
...