在日常工作中,我经常使用Python IDLE,主要用于编写简短的脚本以及作为一个强大而方便的计算器。
我通常必须使用不同的数字基数(主要是十进制、十六进制、二进制,而不是八进制和其他基数)
我知道使用int()hex()bin()oct()是从一个基点移到另一个基点的一个方便的方法,用正确的前缀来预加integer literals是表示数字的另一种方式。
我发现在一个函数中进行一个计算,仅仅是为了在正确的基中看到结果是很不方便的(结果hex()和类似函数的输出是一个字符串),所以我试图实现的是要么有一个函数(或者一个语句?)将内部空闲数表示设置为已知基数(2、8、10、16)。
例子:

>>> repr_hex() # from now on, all number are considered hexadecimal, in input and in output

>>> 10 # 16 in dec
>>> 0x10 # now output is also in hexadecimal

>>> 1e + 2
>>> 0x20

# override should be possible with integer literal prefixes
# 0x: hex ; 0b: bin ; 0n: dec ; 0o: oct
>>> 0b111 + 10 + 0n10 # dec : 7 + 16 + 10
>>> 0x21 # 33 dec

# still possible to override output representation temporarily with a conversion function
>>> conv(_, 10) # conv(x, output_base, current_base=internal_base)
>>> 0n33
>>> conv(_, 2) # use prefix of previous output to set current_base to 10
>>> 0b100001
>>> conv(10, 8, 16) # convert 10 to base 8 (10 is in base 16: 0x10)
>>> 0o20

>>> repr_dec() # switch to base 10, in input and in output
>>> _
>>> 0n16
>>> 10 + 10
>>> 0n20

实现这些功能似乎并不困难,我不知道的是:
是否可以更改空闲时的数字表示?
不需要更改IDLE(源代码)本身就可以做到这一点吗?我查看了IDLE extensions,但不知道从哪里开始访问空闲的内部组件。
谢谢您。

最佳答案

IDLE没有数字表示。它将您输入的代码发送到Python解释器,并显示作为响应返回的字符串。从这个意义上说,用Python编写IDLE是不相关的。任何IDE或REPL for Python代码也是如此。
也就是说,CPython sys模块有一个displayhook函数。对于3.5:

>>> help(sys.displayhook)
Help on built-in function displayhook in module sys:

displayhook(...)
    displayhook(object) -> None

    Print an object to sys.stdout and also save it in builtins._

实际上应该是__builtins__._,如下例所示。注意,输入是任何Python对象。对于IDLE,默认的sys.displayhook是在idlelib/rpc.py中定义的函数。这是一个与你的问题相关的例子。
>>> def new_hook(ob):
    if type(ob) is int:
        ob = hex(ob)
    __builtins__._ = ob
    print(ob)


>>> sys.displayhook = new_hook
>>> 33
0x21
>>> 0x21
0x21

这给了你更重要的一半,你所要求的。在实际使用IDLE中的任何内容之前,我会查看默认版本以确保没有遗漏任何内容。可以编写一个扩展来添加可以切换displayhook的菜单项。
Python故意没有输入预处理器函数。GvR希望.py文件的内容始终是在参考手册的某个版本中定义的python代码。
我已经考虑过将inpushook添加到IDLE的可能性,但是当从编辑器运行.py文件时,我不允许任何inpushook处于活动状态。如果为Shell添加了一个,我会将提示从“>>>”更改为其他内容,例如“hex>”或“bin>”。
编辑:
当使用菜单选择、热键或键绑定显式请求时,还可以编写一个扩展来重写输入代码。或者可以编辑当前的idlelib/ScriptBinding.py以使重写自动进行。我考虑过的钩子会让这件事更容易,但不会扩大现在可以做的事情。

08-25 00:23
查看更多