我宁愿这样做
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
,但实际上我根本没有字典,因为我总是立即调用所有测试。那么,也许是一个元组列表?
答案 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