我有一个抽象的基类,它以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(),但我无法获得对类本身的引用,这就是我想要存储在列表中的内容.一个小小的搜索已经产生了两种可能的解决方案,我想知道最好的解决方案是什么.
在每个类定义后添加一个调用,如下所示:
class Plot_XY(PlotData):
"""Subclass for for plotting X-Y relations of data""" …Run Code Online (Sandbox Code Playgroud) 我需要做很多工作,但幸运的是,很容易解耦到不同的任务中进行异步执行。其中一些是相互依赖的,我很清楚如何在任务中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) 我遇到一种情况,我想在处理异常的同时执行多项操作。由于我想就一般情况进行讨论,因此我将把我的具体情况翻译成一些更一般的语言。
当这段代码中有异常时,我想:
因此,我可以想到两种解决方法,两者都很丑陋:
# 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()功能已被尽可能地排除,但仍包含一个函数调用和三个参数,其中包括一个硬编码的字符串。由于此字符串是唯一的,因此没有理由将其命名为常量。