使用Python中的字典执行对象



我有点拘泥于在字典中使用自定义类对象。

这些是我的课,效果很好。

from sqllibrary import cursor
from cloudlib import upload
class Mycustomconf(object):
def __init__(self):
self.cursor = cursor(foo, bar)
class Mycustomclass1(Mycustomconf):
def __init__(self):
super().__init__()
def something_useful(self, something):
self.upload(self.cursor(f'''SELECT foo FROM bar WHERE id = {something};'''))
def something_useful_too(self, something):
self.upload(self.cursor(f'''SELECT foo FROM bar WHERE id = {something};'''))
class Mycustomclass2(Mycustomconf):
def __init__(self):
super().__init__()
def something_useful(self, something):
self.upload(self.cursor(f'''SELECT foo FROM bar WHERE id = {something};'''))
def something_useful_too(self, something):
self.upload(self.cursor(f'''SELECT foo FROM bar WHERE id = {something};'''))
mcc1 = Mycustomclass1()
mcc2 = Mycustomclass1()

我想根据一个条件执行每个类(Mycustomclass1,Mycustomcclass2(的一个方法。我可以通过以下脚本来实现这一点。

from foobar import mcc1, mcc2
def handler(foo, bar):
try:
mcc1.something_useful('42', '23')
except error1 as er:
mcc1.something_useful_too('42', '22', '11')
try:
mcc2.something_useful('42', 42, '23', 12)
except error1 as er:
mcc2.something_useful_too(42, '23', 12)
...
handler(foo, bar)

这个模式在我想要执行的所有类方法中都是完全相同的(Try"something_useful"除了error execute"something_useful_to"(。

问题是,我已经尝试了一段时间,但我无法获得与前一段代码相同的功能,但我避免了重复的尝试,除了一次又一次地阻止。

这是我在发布之前尝试过的最后一件事:

from foobar import mcc1, mcc2
dict = {"task_a": (mcc1.something_useful('42'),
mcc1.something_useful_too('42')),
"task_b": (mcc2.something_useful('42'),
mcc2.something_useful_too('42'))}
def handler(foo, bar):
for key in dict.keys():
try:
dict[key][0]
except error1 as er:
dict[key][1]

handler(foo, bar)
由于未知原因,新的处理程序函数要慢得多。它似乎在for循环中多次调用这些方法,但我不知道为什么这种方式更慢

感谢您在评论中更正此错误

我认为可能有一种更清洁的方式来实现这一点,而我现在还没有看到。有人能发布比我更干净的方法吗?

提前谢谢!

当前,在声明字典时将评估这些方法。您可以将选项存储为函数引用和参数值的元组:

from foobar import mcc1, mcc2
dict = {"task_a": ((mcc1.something_useful, '42')),
(mcc1.something_useful_too, '42')),
"task_b": ((mcc2.something_useful, '42'),
(mcc2.something_useful_too, '42'))}
def handler(foo, bar):
for key in dict.keys():
try:
dict[key][0](dict[key][1])
except error1 as er:
dict[key][1](dict[key[1])

handler(foo, bar)

最新更新