Python 2.7.2中不同导入样式的问题

时间:2013-08-09 17:07:17

标签: python-2.7

我试图模仿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变量而第二个例子没有? 有一个简单的解决方法吗?

1 个答案:

答案 0 :(得分:1)

Python中的Globals是模块的全局,而不是所有模块。您在不同的范围内有不同的FP。

您已经提出了一个简单的修复方法。导入模块,以便明确引用模块的变量名称。

这是为什么“导入*”

不是一个好习惯的一个例子

官方Python 2.75常见问题解答:How do I share global variables across modules?

你的建议是“丑陋的”,其他人可能会说是明确而准确的。我希望我能想到的其他选择同样难看。做丑陋的