Самый простой способ, которым я нашел «получить» то, что сделал for / else, и, что более важно, когда его использовать, это сконцентрироваться на том, куда переходит оператор break. Конструкция For / else представляет собой один блок. Перерыв выпрыгивает из блока и, таким образом, перепрыгивает через условие else. Если бы содержимое предложения else просто следовало за предложением for, оно никогда бы не перепрыгнуло, и поэтому эквивалентную логику нужно было бы предоставить, поместив его в if. Это было сказано ранее, но не совсем в этих словах, так что это может помочь кому-то еще. Попробуйте запустить следующий фрагмент кода. Я искренне поддерживаю комментарий «без перерыва» для ясности.
for a in range(3):
print(a)
if a==4: # change value to force break or not
break
else: #no break +10 for whoever thought of this decoration
print('for completed OK')
print('statement after for loop')
Not out of the box.
You'll need to buffer the data from the original stream in a FIFO manner, discarding only data which has been read by all "reader" streams.
I'd use:
Это может быть сложно, не рискуя сохранить все в буфере в памяти (если потоки находятся в BOF и EOF соответственно).
Интересно, не проще ли записать поток на диск , скопируйте его и получите два потока для чтения с диска с самоудалением, встроенным в Close ()
(т.е. напишите свою собственную оболочку Stream
вокруг FileStream
) .
Вы действительно не можете сделать это без дублирования хотя бы части исходного потока - в основном из-за того, что если звучит не так, как будто вы можете контролировать скорость, с которой они потребляются ( несколько потоков?). Вы могли бы сделать что-нибудь умное в отношении одного чтения за другим (и тем самым сделать копию только на этом этапе), но сложность этого звучит так, как будто это не стоит усилий.
I do not think you will be able to find a generic implementation to do just that. A Stream is rather abstract, you don't know where the bytes are coming from. For instance you don't know if it will support seeking; and you don't know the relative cost of operations. (The Stream might be an abstraction of reading data from a remote server, or even off a backup tape !).
If you are able to have a MemoryStream and store the contents once, you can create two separate streams using the same buffer; and they will behave as independent Streams but only use the memory once.
Otherwise, I think you are best off by creating a wrapper class that stores the bytes read from one stream, until they are also read by the second stream. That would give you the desired forward-only behaviour - but in worst case, you might risk storing all of the bytes in memory, if the second Stream is not read until the first Stream has completed reading all content.