我在日常工作中经常使用Python IDLE,主要用于简短的脚本和强大而方便的计算器.
我通常必须使用不同的数字基(大多数是十进制,十六进制,二进制和不太频繁的八进制和其他基数.)
我知道,使用int()
,hex()
,bin()
,oct()
是移动从一个基站到另一个前缀的便捷方式整数文字与正确的前缀是另一种方式来表达一个数.
我发现在一个函数中进行计算只是为了在正确的基础上看到结果(并且产生的hex()
和类似函数的输出是一个字符串)非常不方便,所以我想要实现的是要么函数(或可能是一个语句?),它将内部IDLE编号表示设置为已知的基数(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(源代码)本身的情况下执行此操作?我查看了IDLE扩展,但我不知道从哪里开始可以访问IDLE内部.
谢谢.
IDLE没有数字表示.它将您输入的代码发送到Python解释器,并显示作为响应发回的字符串.从这个意义上讲,IDLE是用Python编写的.Python代码的任何IDE或REPL都是如此.
也就是说,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中的任何东西之前,我会查看默认版本以确保我没有错过任何内容.可以编写一个扩展来添加可以切换显示挂钩的菜单条目.
Python故意没有输入预处理器功能.GvR希望.py文件的内容始终是python代码,如某些版本的参考手册中所定义.
我已经考虑过向IDLE添加一个inputhook的可能性,但是当我从编辑器运行.py文件时,我不会允许它处于活动状态.如果为Shell添加了一个,我会将提示从">>>"更改为其他内容,例如"hex>"或"bin>".
编辑:当使用菜单选择或热键或键绑定明确请求时,也可以编写扩展来重写输入代码.或者可以编辑当前的idlelib/ScriptBinding.py以自动重写.我想过的钩子会让这更容易,但不能扩展现在可以做的事情.