我试图模仿Kernighan和Ritchie C编程书中的一些C程序,并遇到了getchar()的问题。我已经有了初始程序,但是当我将getchar()移动到它自己的文件stdio.py时,它只能在声明 import stdio 之后使用 stdio.getchar()之类的调用,而不是使用** getchar()形式的调用声明类型为:来自stdio import * 的调用。
我在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。因此,我在输出shell中得到无效NONE。
问题。 为什么第一个例子在stdio.py中初始化FP变量而第二个例子没有? 有一个简单的解决方法吗?
答案 0 :(得分:1)
Python中的Globals是模块的全局,而不是所有模块。您在不同的范围内有不同的FP。
您已经提出了一个简单的修复方法。导入模块,以便明确引用模块的变量名称。
这是为什么“导入*”
不是一个好习惯的一个例子官方Python 2.75常见问题解答:How do I share global variables across modules?
你的建议是“丑陋的”,其他人可能会说是明确而准确的。我希望我能想到的其他选择同样难看。做丑陋的。