给出下一个控制台:
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,应该给出什么样的参数?
真诚地,一个真正缺乏经验的程序员。答案 0 :(得分: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”和“Context Managers”..
http://docs.python.org/2/reference/compound_stmts.html#with
http://docs.python.org/2/reference/datamodel.html#context-managers