2

次のコンソールが与えられた場合:

import os
import tty
import termios
from sys import stdin

class Console(object):

    def __enter__(self):
        self.old_settings = termios.tcgetattr(stdin)
        self.buffer = []
        return self

    def __exit__(self, type, value, traceback):
        termios.tcsetattr(stdin, termios.TCSADRAIN, self.old_settings)

    ...

    def dimensions(self):
        dim = os.popen('stty size', 'r').read().split()
        return int(dim[1]), int(dim[0])

    def write(self, inp):
        if isinstance(inp, basestring):
            inp = inp.splitlines(False)
        if len(inp) == 0:
            self.buffer.append("")
        else:
            self.buffer.extend(inp)

    def printBuffer(self):
        self.clear()
        print "\n".join(self.buffer)
        self.buffer = []

今、私はそのバッファにいくつかの文字を取得する必要がありますが、文字が正しい順序で与えられておらず、いくつかの場所が空になります。たとえば、画面の12列目と14行目に「w」を表示してから、他の場所に「w」を配置し、あちらに「b」を配置したい場合などです...(コンソールは大きいです)これを処理するのに十分です)。どうすればこれを実装できますか?私は本当にこの問題を解決する方法の手がかりを持っていません。

私を悩ませているもう1つの質問は、この出口コンストラクターをどのように呼び出すかです。どのようなパラメーターを指定する必要がありますか?

心から、本当に経験の浅いプログラマー。

4

1 に答える 1

1

あなたの質問の2番目の部分に答えるために...

ステートメントをclass Console使用して呼び出す必要があります。これにより、ルーチンwithが自動的に呼び出されます。例えば:__enter____exit__

class CM(object):
    def __init__(self, arg):
         print 'Initializing arg .. with', arg
    def __enter__(self):
         print 'Entering CM'
    def __exit__(self, type, value, traceback):
         print 'Exiting CM'
         if type is IndexError:
             print 'Oh! .. an Index Error! .. must handle this'
             print 'Lets see what the exception args are ...', value.args
             return True

それを実行する:

with CM(10) as x:
    print 'Within CM'

出力:

Initializing arg .. with 10
Entering CM
Within CM
Exiting CM

の引数__exit__は例外に関連しています。withステートメントを終了するときに例外がない場合、すべての引数(exception_type、exception_instance、exception_traceback)はになりますNoneこれは、 exit引数の使用方法を示す例です...

例外を除いた例:

with CM(10) as x:
    print 'Within CM'
    raise IndexError(1, 2, 'dang!')

出力:

 Initializing arg .. with 10
 Entering CM
 Within CM
 Exiting CM
 Oh! .. an Index Error! .. must handle this
 Lets see what the exception args are ... (1, 2, 'dang!')

ここで「With-Statement」と「ContextManagers」をチェックしてください。

http://docs.python.org/2/reference/compound_stmts.html#with

http://docs.python.org/2/reference/datamodel.html#context-managers

于 2012-11-22T14:25:34.333 に答える