2

我有一段看起来像这样的代码:

funcs = {'one': self.one,
         'two': self.two,
        }

def dispatch(var):
    funcs[var]()

但不仅仅是两个功能——最终需要几十个。我查看了PEP 443 - Single-dispatch generic,我认为它可能会有所帮助。但是,我不确定这是否是:

  1. 一个好主意——pythonic?
  2. 怎么做?

编辑:关于我做什么的更多信息......我正在获取我需要解析的命令(字符串)。根据接收到的命令,调用不同的解析器。命令的第一个词总是唯一的和预定义的,其余的取决于所述的第一个词。我可以创建一个完整的语法并这样做,但这是矫枉过正的。命令的示例是:

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

2 回答 2

4

PEP 443 提出了一种在 Python中执行本质上是函数重载的方法。无论如何,由于它似乎将包含在 Python 3.4 中,因此如果使用其他 Python 版本的人尝试使用您的代码,使用它可能会导致兼容性问题。

我觉得你的原版没问题。正如评论所指出的,您需要将var字符串转换为变量(错字?),但除此之外,您的方法应该可以轻松扩展。

但是,由于手动跟踪所有不同的函数及其名称可能会在某一点之后变得令人厌烦,您也许可以尝试创建一个装饰器来自动记录和跟踪函数名称并构造函数字典:

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
于 2013-09-18T15:57:39.293 回答
1

我认为您正在寻找类似的东西:

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
于 2013-09-18T15:56:19.123 回答