1

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,

ここまではOK。ただし、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 変数は常に NONE を返すため、getchar() を無限に呼び出します。したがって、出力シェルで無限の NONE を取得します。

質問。最初の例では stdio.py の FP 変数が初期化され、2 番目の例では初期化されないのはなぜですか? 簡単な修正はありますか?

4

1 に答える 1

1

Python のグローバルは、すべてのモジュールにわたってではなく、モジュールに対してグローバルです。さまざまなスコープにさまざまな FP があります。

あなたはすでに簡単な修正を考え出しています。モジュールの変数名を明示的に参照するようにモジュールをインポートします。

これは、"import *" が適切でない理由の例です。

公式の Python 2.75 FAQ から:モジュール間でグローバル変数を共有するにはどうすればよいですか?

あなたが提案するのは「醜い」です、他の人は明示的で正確であると言うかもしれません. 私が考えることができる他の選択肢は、同じように醜いものになると思います. 醜いことをしてください。

于 2013-08-09T21:15:47.153 に答える