私は頻繁にPythonインタープリターを使用して迅速な数値計算を行い、すべての数値結果を、たとえば指数表記を使用して自動的に出力したいと考えています。セッション全体でこれを設定する方法はありますか?
たとえば、次のようにします。
>>> 1.e12
1.0e+12
いいえ:
>>> 1.e12
1000000000000.0
ご存知のように、%
演算子orを使用してstr.format
文字列をフォーマットできます。
例えば:
>>> "%e" % 1.e12
'1.000000e+12'
組み込みクラスにモンキー パッチを適用してフォーマットを変更できるかどうか疑問に思ってfloat
いましたが、Python では許可されないようです。
>>> 1.e12.__class__.__repr__ = lambda x: "%e" % x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'float'
したがって、私が考えることができる唯一の他のことは、出力をキャプチャして再フォーマットし、標準出力に送信する独自のファイルのようなオブジェクトを作成することです。次に、インタープリターの標準出力をこのオブジェクトにリダイレクトします。
sys.stdout = my_formatting_object
うーん… 100%の解決策ではないけど、これが頭に浮かんだ…
オーバーライドされたメソッドを持つfloatのサブクラスを定義するのはどうですか__str__
(exp表記で出力するため)。そして、このクラスのオブジェクト構築ですべての式をラップする必要があります)。デイブのソリューションよりも少し短くなります。クラスを一度定義してから、次のように記述します。
>>> F(1.e12)
1.0e+12
>>> F(3.)
3.0e+0
>>> F(1.+2.+3.+4.)
1.0e+1
...
上記の Dave Webb のヒントに基づいています。もちろん、必要に応じて精度を設定し ("%.3e")、必要に応じて writelines を上書きすることもできます。
import os
import sys
class ExpFloatFileObject:
def write(self, s):
try:
s = "%e"%float(s)
except ValueError:
pass
sys.__stdout__.write(s)
def __getattr__(self, name):
return getattr(sys.__stdout__, name)
sys.stdout = ExpFloatFileObject()
と使用法:
>>> 14000
1.400000e+04
>>> "text"
'text'