小编Glo*_*eye的帖子

调用类方法作为初始化的一部分

当前状态

我有一个抽象的基类,它以numpy数组的形式托管数据,知道如何处理这些数据,哪些可以解释matplotlib如何绘制它.为了容纳不同类型的数据,它有许多子类,如下所示:

class PlotData():
    """Base Class"""
    subclasslist = []

    @classmethod
    def register(cls):
        super().subclasslist.append(cls)

    def __new__(self, initdata, *args, **kwargs):
        for subclass in subclasslist:
            try:
                subclass.__test__(initdata)
            except AssertionError:
                continue
            else:
                break
        else:
            raise TypeError("Initdata does not fit any known subclass")
        return subclass(initdata, *args, **kwargs)

class Plot3D(PlotData):
    """Subclass for 3d-plotting data"""
    def __test__(initdata):
        assert Data_is_the_right_kind

class Plot_XY(PlotData):
    """Subclass for for plotting X-Y relations of data"""
    def __test__(initdata):
        assert Data_is_the_right_kind
Run Code Online (Sandbox Code Playgroud)

问题

现在,问题是如何将类引用引入子类列表.起初我想在类体中调用super().register(),但我无法获得对类本身的引用,这就是我想要存储在列表中的内容.一个小小的搜索已经产生了两种可能的解决方案,我想知道最好的解决方案是什么.

解决方案1

在每个类定义后添加一个调用,如下所示:

class Plot_XY(PlotData):
    """Subclass for for plotting X-Y relations of data""" …
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
67
查看次数

我可以在 Python 中多次等待同一个任务吗?

我需要做很多工作,但幸运的是,很容易解耦到不同的任务中进行异步执行。其中一些是相互依赖的,我很清楚如何在任务中await与其他人一起获得结果。但是,我不知道如何让多个不同的任务等待同一个协程,并且都得到结果。据我所知,文档也没有提及这种情况。考虑以下最小示例:

from asyncio import create_task, gather

async def TaskA():
    ...  # This is clear
    return result

async def TaskB(task_a):
    task_a_result = await task_a
    ...  # So is this
    return result

async def TaskC(task_a):
    task_a_result = await task_a
    ...  # But can I even do this? 
    return result

async def main():
    task_a = create_task(TaskA())
    task_b = create_task(TaskB(task_a))
    task_c = create_task(TaskC(task_a))
    gather(task_b, task_c)  # Can I include task_a here to signal the intent of "wait for all tasks"? …
Run Code Online (Sandbox Code Playgroud)

task python-asyncio python-3.9

4
推荐指数
1
解决办法
3069
查看次数

哪个更糟糕-代码重复或两次尝试/除外?

我遇到一种情况,我想在处理异常的同时执行多项操作。由于我想就一般情况进行讨论,因此我将把我的具体情况翻译成一些更一般的语言。

当这段代码中有异常时,我想:

  1. 始终执行回滚式操作
  2. 如果它是特定于应用程序的异常,我想执行一些日志记录并吞下该异常。

因此,我可以想到两种解决方法,两者都很丑陋:

# Method nested-try/except block
try:
    try:
        do_things()
    except:
        rollback()
        raise
except SpecificException as err:
    do_advanced_logging(err)
    return
Run Code Online (Sandbox Code Playgroud)
# Method Duplicate Code
try:
    do_things()
except SpecificException as err:
    rollback()
    do_advanced_logging(err)
    return
except:
    rollback()
    raise
Run Code Online (Sandbox Code Playgroud)

两者将具有相同的行为。

我自己倾向于嵌套的try / except解决方案。尽管速度可能会稍慢一些,但我认为速度差异在这里并不重要-至少与我的具体情况无关。我想避免重复代码,这也是因为我的rollback()语句比数据库回滚所涉及的稍微多一点,即使它具有完全相同的目的(它涉及Web-API)。

我没有发现有更好的第三种选择吗?还是重复代码方法更好?请注意,rollback()功能已被尽可能地排除,但仍包含一个函数调用和三个参数,其中包括一个硬编码的字符串。由于此字符串是唯一的,因此没有理由将其命名为常量。

python design-patterns

2
推荐指数
1
解决办法
90
查看次数