按特定顺序调用函数列表?

时间:2017-10-25 09:25:56

标签: python python-3.x

我宁愿这样做

class A:
    def __init__(self):
        self._TESTS = {
            'val1': self.test1,
            #...
            'val10': self.test10
        }
    def test(self, x):
        for v, f in self._TESTS.items():
            if f(x):
                return v
        return None

这个

class A:
    def test(self, x):
        if self.test1(x):
            return 'val1'
        #...
        if self.test10(x):
            return 'val10'
        return None

但是我需要按特定顺序调用test*方法。你会怎么做?

我可以使用collections.OrderedDict,但实际上我根本没有字典,因为我总是立即调用所有测试。那么,也许是一个元组列表?

4 个答案:

答案 0 :(得分:2)

是的,使用tuples列表,保留订单,不需要dict,因为不需要查找。循环略有不同,不再是.items(),而是直接解包:

class A:
    def __init__(self):
        self._TESTS = [
            ('val1', self.test1),
            #...
            ('val10', self.test10)
        ]
    def test(self, x):
        for v, f in self._TESTS:
            if f(x):
                return v
        return None

答案 1 :(得分:1)

您可以简单地使用list tuples,如下所示:

self._TESTS =[("v1", self.test1), ...]

答案 2 :(得分:1)

如果您的测试函数以任意顺序放置 - 使用元组的排序列表:

class A:
    def __init__(self):
        self._TESTS = [
            (2, 'val10', self.test10),
            ...
            (1, 'val1', self.test1),
            #...                
        ]

    def test(self, x):
        for t in sorted(self._TESTS):
            if t[2](x):
                return t[1]
        return None

答案 3 :(得分:1)

我不太明白这个问题,因为你已经提供了一个可能肯定有效的答案。 完整的答案是:这取决于。如果你仍然保持你的测试字典很重要,要对它进行某种外部访问,那么你应该只用test(self, x)方法指定执行顺序:

class A:
def __init__(self):
    self._TESTS = {
        'val1': self.test1,
        #...
        'val10': self.test10
    }
def test(self, x):
    my_test_sequence = ['val10', 'val1']
    for v in my_test_sequence:
        if self._TESTS[v](x):
            return v
    return None
def test1(self, arg):
    return True
def test10(self, arg):
    return True

A().test(1) #val10