Python单一分派函数(PEP 443)

Python单一分派函数(PEP 443),python,Python,我有一段代码如下所示: funcs = {'one': self.one, 'two': self.two, } def dispatch(var): funcs[var]() 但是,对于不仅仅是两个函数的情况,最终还需要几十个函数。我看了一下,我想可能会有帮助。但是,我不确定这是否是: 一个好主意——蟒蛇 怎么做 编辑:有关我所做工作的更多信息。。。我得到了需要解析的命令(字符串)。根据接收到的命令,调用不同的解析器。命令的第一个字始终是唯一的和预

我有一段代码如下所示:

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

def dispatch(var):
    funcs[var]()
但是,对于不仅仅是两个函数的情况,最终还需要几十个函数。我看了一下,我想可能会有帮助。但是,我不确定这是否是:

  • 一个好主意——蟒蛇
  • 怎么做
  • 编辑:有关我所做工作的更多信息。。。我得到了需要解析的命令(字符串)。根据接收到的命令,调用不同的解析器。命令的第一个字始终是唯一的和预定义的,其余的取决于所述的第一个字。我可以创建一个完整的语法,并这样做,但这是矫枉过正。命令示例如下:

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

    我想你在寻找类似的东西:

    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
    

    PEP443提出了一种方法来实现Python的基本功能。在任何情况下,由于它似乎被列入Python3.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
    

    难道不应该
    funcs['var']()
    funcs[var]()
    ?政治公众人物提出了完全不同的建议。您的函数非常好(将
    'var'
    更改为
    var
    后)。为什么需要24个这样的函数?你在做什么?你能给我们提供更多的上下文吗?首先,它可能类似于
    funcs[var]()
    ,否则如果看不到更多的代码,它将无法工作,很难说PEP 443是否适用于你。这两个函数
    self.one
    self.two
    的作用是什么?在您的代码中如何准确调用
    dispatch
    ?您链接的PEP提出了一种在多个类型上使用单个泛型函数的方法,而不必显式检查参数的类型。+1我想指出,当一个函数附加了多个decorator时,这可能会返回意外的结果
    @a.add
    应该(很可能)始终是顶部修饰符,并且后续函数的内部函数应该将其
    \uuuuuuu name\uuuuu
    更改为传递的函数的
    \uuuu name\uuu
    。例如,
    def dec(func):#定义内部#内部。uu name_uu=func.u name_uu;返回内部