Python вмещающие функции

Вот класс утилиты ConsoleOutputCapturer. Он позволяет выводить выход на существующую консоль, однако позади сцены сохраняется захват выходного текста. Вы можете управлять захватом с помощью методов старт / стоп. Другими словами, вызовите начало запуска захвата вывода консоли, и как только вы закончите захват, вы можете вызвать метод stop, который возвращает значение String, содержащее вывод консоли для временного окна между вызовами start-stop. Этот класс не является потокобезопасным.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;

public class ConsoleOutputCapturer {
    private ByteArrayOutputStream baos;
    private PrintStream previous;
    private boolean capturing;

    public void start() {
        if (capturing) {
            return;
        }

        capturing = true;
        previous = System.out;      
        baos = new ByteArrayOutputStream();

        OutputStream outputStreamCombiner = 
                new OutputStreamCombiner(Arrays.asList(previous, baos)); 
        PrintStream custom = new PrintStream(outputStreamCombiner);

        System.setOut(custom);
    }

    public String stop() {
        if (!capturing) {
            return "";
        }

        System.setOut(previous);

        String capturedValue = baos.toString();             

        baos = null;
        previous = null;
        capturing = false;

        return capturedValue;
    }

    private static class OutputStreamCombiner extends OutputStream {
        private List<OutputStream> outputStreams;

        public OutputStreamCombiner(List<OutputStream> outputStreams) {
            this.outputStreams = outputStreams;
        }

        public void write(int b) throws IOException {
            for (OutputStream os : outputStreams) {
                os.write(b);
            }
        }

        public void flush() throws IOException {
            for (OutputStream os : outputStreams) {
                os.flush();
            }
        }

        public void close() throws IOException {
            for (OutputStream os : outputStreams) {
                os.close();
            }
        }
    }
}
1
задан Patriots299 20 March 2019 в 04:09
поделиться

2 ответа

Функция parent возвращает другую функцию. Эта функция должна вызываться для вступления в силу:

print(parent()())

Или, чтобы подчеркнуть последовательность вызова:

print((parent())()
0
ответ дан DYZ 20 March 2019 в 04:09
поделиться

Здесь вам нужно вернуть son ()

def parent(x="Hello"):
    text = x

    def son():
        print(text)

    return son # return son()

print(parent())

Здесь вы получите результат разницы, потому что ссылаетесь на akin ()

def parent(x="Hello"):
    text = x

    def son():
        print(text)

    return son

akin = parent()
akin() # print(akin) will get the same output of first program

Разница в том, что каждая функция имеет адрес памяти, если вы ссылаетесь на функцию без скобок (), вы получите адрес этой функции. Таким образом, в вашей первой программе вы возвращаете адрес памяти функции, чтобы вы могли получить доступ к содержимому с помощью parent () () или вернуть фактическое значение из функции вместо возврата адреса

0
ответ дан DYZ 20 March 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: