我已经使用AnalogX PCalc多年来作为计算器回到包络交互式计算,其中整数数学很重要,灵活的基本输入和输出很重要。例如,在使用定点数时,通常不能同时使用十进制或十六进制数字视图来帮助您解决问题。它还内置了漂亮的C数学函数,以及返回整数的字符串函数。缺点是明显的,因为它在功能集和Windows中都是有限的。
我认为Python互动会是一个更好的计算器,它通常已经是,如果你只关心一个基础,并不关心整数学数学诡计。但至少对于这两个限制,它并不是那么好。因此,至少可以让Python交互式打印多个基础中的整数,或者超出基数10的其他基础,而无需预先添加" hex()"每一次?
答案 0 :(得分:1)
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)
现在您可以运行此脚本并将所需的base作为第一个CLI参数传递:
$ python <this_script> 16
如果任何表达式的结果是整数,它将以十六进制格式打印。
当然可以添加更多的基础(假设你在那里有一个函数将十进制值转换为该基数),并且有更好的方法来传递CLI参数。