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测试
,不是吗?可能适合动态订购,谢谢。只是想看看是否有更多推荐的技术和最佳实践谢谢。只是想看看是否有更多的推荐技术和最佳实践