0

私は Python インタープリターを作成しており、インタラクティブ モードの Python インタープリターのように、関数の戻り値を stdout にリダイレクトしたいと考えています。このモードでは、ユーザーが関数を呼び出すと、その戻り値が画面に出力されます。式でも同じことが起こります。

例えば

>>> foo()
'Foo return value'
>>> 2+4
6
>>> print('Hello!')
'Hello!'

の変更は機能にsys.stdoutのみ影響しprintます。他の式を stdout にリダイレクトするにはどうすればよいですか?

ありがとうございました

4

2 に答える 2

1

まず、対話モードでは、呼び出された関数からの戻り値が出力されません。代わりに、ユーザーが入力した式の結果を出力します。それが関数呼び出しでない場合でも、出力されます。3 つの関数呼び出しがある場合でも、3 行ではなく 1 つの結果が出力されます。等々。

したがって、関数の戻り値を stdout にリダイレクトしようとするのは間違っています。

対話型インタープリターが行うことは、次のようなものです。

line = raw_input(sys.ps1)
_ = eval(line)
if _ is not None:
    print repr(_)

sys.ps1(対話型プロンプトから変更して、プロンプトの外観を変更したり、アクセス_して最後の値を取得したりできることに気付くかもしれません。)

しかし、実際にはそうではありません。そして、それはあなた自身がこれに取り組むべき方法でもありません。試してみると、独自のものをglobalsユーザーのものから分離し、ステートメントと式を処理し、複数行のステートメントと式を処理するなどの複雑さに対処する必要があります (実行するのraw_input(sys.ps2)は簡単ですが、いつそれを行うべきかをどのように知っています? )、readlineおよび との適切な相互作用rlcompleteなど。

これを行う簡単な方法を説明するカスタム Python インタープリターと呼ばれるドキュメントのセクションがあります。

この章で説明するモジュールを使用すると、Python の対話型インタープリターに似たインターフェイスを作成できます。Python 言語に加えて特別な機能をサポートする Python インタープリターが必要な場合は、codeモジュールを参照する必要があります。

そしてcode

… Python で read-eval-print ループを実装する機能を提供します。対話型インタープリター プロンプトを提供するアプリケーションを構築するために使用できる 2 つのクラスと便利な関数が含まれています。

アイデアは、あなたが引き継ぎたいレベルまで、Pythonにすべての難しいことを任せてから、その上にその部分を書くだけだということです.

IDLEipython、などのソースを参考にしてくださいbpython

于 2013-02-05T22:35:12.977 に答える
0

exec()を使用してユーザー入力を実行する代わりに、次を試してくださいeval()

retval = eval(user_input)
sys.stdout.write(repr(retval) + "\n")
于 2013-02-05T20:36:57.920 に答える