Последствия только использования стека в C ++

Мне нравится общая идиома использования диспетчера контекста, но (слишком) тривиальное решение заканчивается закрытием sys.stdin, когда вы находитесь вне оператора with, которого я хочу избежать.

Заимствование из этого ответа , это обходное решение:

import sys
import contextlib

@contextlib.contextmanager
def _smart_open(filename, mode='Ur'):
    if filename == '-':
        if mode is None or mode == '' or 'r' in mode:
            fh = sys.stdin
        else:
            fh = sys.stdout
    else:
        fh = open(filename, mode)
    try:
        yield fh
    finally:
        if filename is not '-':
            fh.close()

if __name__ == '__main__':
    args = sys.argv[1:]
    if args == []:
        args = ['-']
    for filearg in args:
        with _smart_open(filearg) as handle:
            do_stuff(handle)

Предположим, вы могли бы достичь чего-то подобного с os.dup() , но код I приготовленный до этого, оказался более сложным и более волшебным, тогда как выше было несколько неуклюже, но очень просто.

16
задан BefittingTheorem 12 September 2010 в 14:15
поделиться