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”等等......(控制台很大足以处理这个)。我怎么能实现这个?我真的不知道如何解决这个问题。

另一个困扰我的问题是如何调用这个exit-constructor,应该给出什么样的参数?

真诚的,一个真正缺乏经验的程序员。

4

1 回答 1

1

要回答您问题的第二部分...

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. 这是一个显示如何使用退出参数的示例...

一个例外的例子:

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”和“上下文管理器”..

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 回答