Python標準ライブラリはcode
とcodeop
モジュールを提供しているので、REPLの機能は他のプログラムでも使用できます。
たとえば、標準のライブラリクラスを拡張して、整数結果を他のベースに変換する新しい対話型コンソールを提供するサンプルPythonファイルです(現在ベース2と16がサポートされていますが、余分な行のカップルはPython 2と3の両方に
#!/usr/bin/env python
from __future__ import print_function
import sys
import code
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
class NumericConsole(code.InteractiveConsole):
def __init__(self, *args, **kwargs):
code.InteractiveConsole.__init__(self, *args, **kwargs)
self.base = 10
def runcode(self, code_to_run):
return_val, output = self._call_and_capture_output(code.InteractiveConsole.runcode, self, code_to_run)
try:
output = self._to_target_base(output) + '\n'
except ValueError:
pass
print(output, end='')
return return_val
def _to_target_base(self, value):
# this can be extended to support more bases other than 2 or 16
as_int = int(value.strip())
number_to_base_funcs = {16: hex, 2: bin}
return number_to_base_funcs.get(self.base, str)(as_int)
def _call_and_capture_output(self, func, *args, **kwargs):
output_buffer = StringIO()
stdout = sys.stdout
try:
sys.stdout = output_buffer
func_return = func(*args, **kwargs)
finally:
sys.stdout = stdout
return (func_return, output_buffer.getvalue())
def interact(base=10):
console = NumericConsole()
console.base = base
console.interact()
if __name__ == '__main__':
base = len(sys.argv) > 1 and int(sys.argv[1]) or 10
interact(base)
をサポートするために使用されている今、あなたは、このスクリプトを実行し、最初のCLI引数として所望の塩基を渡すことができます。
$ python <this_script> 16
と結果の場合任意の式の値が整数の場合、16進形式で出力されます。もちろん、以上の塩基の
は(あなたがそのベースに10進値を変換するために、そこに機能を持っていますと仮定)を追加することができ、およびCLIの引数に渡すためにきれいな方法があります。
は、あなただけのすべての希望の形式で番号を出力機能を備えた小型のモジュールを作成することができませんか? –
Decimalモジュールをチェックアウトすると、Decimal型のサブクラスを簡単に優先形式で出力することができ、除算を実行するときに浮動小数点精度の問題に遭遇することはありません。 – Perkins