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

Python 按特定顺序调用函数列表?,python,python-3.x,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):

我宁愿这样做

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,但实际上我根本没有字典,因为我总是一次调用所有测试。所以,元组列表可能?

是的,与
元组列表一起工作,顺序保留,不需要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

是的,可以使用
元组列表
,保留顺序,不需要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

您可以简单地使用
元组的
列表,如下所示:

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

您可以简单地使用
元组的
列表,如下所示:

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

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

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

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

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

我不太明白这个问题,因为你已经提供了一个可能的答案,这肯定会奏效。 完整的答案是:视情况而定。如果您仍然保留测试字典以获得某种外部访问权很重要,那么您应该在
测试(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

我不太明白这个问题,因为你已经提供了一个可能的答案,这肯定会奏效。 完整的答案是:视情况而定。如果您仍然保留测试字典以获得某种外部访问权很重要,那么您应该在
测试(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

您可以有多少种测试方法?@cᴏʟᴅsᴘᴇᴇᴅ 令人惊讶的是,10:)我想我实际上没有那么多,但在你问了之后,我数了数:)啊哈。我纯粹出于好奇而问。我想知道什么样的问题可以保证这样有趣的函数模型ᴏʟᴅsᴘᴇᴇᴅ 对我来说似乎更干净,即使我有3-4种测试方法,你能有多少种?@cᴏʟᴅsᴘᴇᴇᴅ 令人惊讶的是,10:)我想我实际上没有那么多,但在你问了之后,我数了数:)啊哈。我纯粹出于好奇而问。我想知道什么样的问题可以保证这样有趣的函数模型ᴏʟᴅsᴘᴇᴇᴅ 对我来说似乎更干净,即使我有3-4个测试,我也可以按照我需要的顺序编写测试,不是吗?这对动态排序很有好处,虽然我可以按照预先需要的顺序编写
\u测试
,不是吗?可能适合动态订购,谢谢。只是想看看是否有更多推荐的技术和最佳实践谢谢。只是想看看是否有更多的推荐技术和最佳实践