背景
我只是在一门课程之后做一个练习(如果有人好奇的话,在 FXPHD 的 pyt201),我们正在构建的其中一件事是一个 SequentialRange 类,它旨在表示镜头的帧。为简单起见,假设整数帧数并且没有奇怪的子帧渲染。
我正在实现的一种方法是add_frames(self, *frames)
接受大量未指定的迭代并将它们添加进去。演示代码只是这样做:
for frame in imap(int, chain(*frames)):
self.add(frame)
我想..
...避免这种行为,因为如果您传入格式错误的序列(例如,[1,2,”fish”,6,7]),您生成的 SequentialRange 将处于那些丑陋的半处理状态之一,这对任何人都没有帮助. 因为它是一个集合,所以我知道你可以只修补输入,然后读取它,然后欺骗将被抛出,但我想把它写下来,以便 add_frames() 操作更加二进制,或者成功加载所有帧,或者不会污染现有的集合。
基本上,我的思考过程是,我将有一个add_frame()
方法,我会做任何必要的神秘巫术(现在只是self.add(int(the_input_frame_value))
),这在某种程度上为我提供了我对输入的健全性检查。所以我可以从输入中创建一个临时集,如果成功,则将临时集和原始集合并。我发现的问题是联合返回我一个由两组联合组成的副本,所以我不得不求助于:
temporary_set = SequentialRange()
try:
for frame in itertools.chain(*frames):
temporary_set.add_frame(frame)
except ValueError:
# placeholder flameout message
print("malformed input, no changes made")
return
except:
raise
for x in temporary_set:
self.add_frame(x)
它有效,但...
...我不相信重新遍历该系列是个好主意。感觉,呃……错了?主要是因为我已经遍历了我的输入以进行完整性检查,所以我不喜欢在添加阶段重复。
所以是的,关于我做错了什么有什么建议吗?我无法摆脱这样一种感觉,即我缺少一些可以使这更容易的东西,但与此同时,由于这是纯粹的学习,因此也欢迎使用替代方法来解决问题。