我试图模仿 Kernighan 和 Ritchie C 编程书中的一些 C 程序,但遇到了 getchar() 的问题。我已经使初始程序正常工作,但是当我将 getchar() 移动到它自己的文件 stdio.py 时,它仅适用于声明import stdio后的stdio.getchar()之类的调用,而不适用于声明类型为 : from stdio import的调用*使用 **getchar() 形式的调用。
我在 FileCopy.py 中的工作代码
import stdio
import StringIO
def FileCopy():
c = stdio.getchar()
while (c!=stdio.EOF):
stdio.putchar(c)
c = stdio.getchar()
if __name__ == "__main__":
SRC = raw_input(">>")
print "Echoe: ",
stdio.FP = StringIO.StringIO(SRC)
FileCopy()
我的 stdio.py 的代码
"""
Python implementation of getchar
"""
EOF =""
# python specific
import StringIO
FP = None
def getchar():
if FP:
return FP.read(1)
def ungetc(c=''):
if FP:
FP.seek(-1, os.SEEK_CUR)
def putchar(c):
print c,
好的,到目前为止一切都很好。但是对 stdio.getchar() 的调用看起来很难看,所以我使用了stdio import * 的形式并删除了它们。主要思想是删除所有前缀以提高可读性。没有对 stdio.py 进行任何更改。
"""
File Copy
Kernighan Ritchie page 16
stdio has been created in Python file stdio.py
and defines standard output functions putchar,getchar and EOF
"""
from stdio import *
import StringIO
def FileCopy():
c = getchar()
while (c!=EOF):
putchar(c)
c = getchar()
if __name__ == "__main__":
SRC = raw_input(">>")
print "Echoe: ",
FP = StringIO.StringIO(SRC)
FileCopy()
输出;
作为 FP 变量对 getchar() 的无限调用总是返回 NONE。因此,我在输出外壳中得到无限的 NONE 。
问题。为什么第一个示例初始化 stdio.py 中的 FP 变量而第二个示例没有?有简单的解决方法吗?