首页 > 解决方案 > 在 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,Mycustomclass2)的方法之一。我可以使用以下脚本来实现。

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)
        

该模式在我要执行的所有类方法中完全相同(尝试“something_useful”,除了错误执行“something_useful_too”)。

问题是,我已经尝试了一段时间,但我无法获得与以前的代码相同的功能,但一次又一次地避免了冗余的 try-except 块。

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

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 循环中不止一次调用这些方法,但我不知道为什么这样会更慢。

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

我认为可能有一种更清洁的方法来执行此操作,而我现在还没有看到。任何人都可以发布比我更清洁的方法吗?

先感谢您!

标签: python

解决方案


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

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)

推荐阅读