Python控制台默认十六进制显示

12

我在Python控制台上进行了大量的工作,其中大部分涉及地址,我希望看到它们的十六进制形式。

所以如果a = 0xBADF00D,当我仅输入Python> a来查看其值时,我希望Python回复0xBADF00D而不是195948557

我知道我可以输入'0x%X' % a以以十六进制方式查看它,但我正在寻找一种Python控制台选项,使其自动执行此操作。是否存在像这样的东西?谢谢!


我认为这是不可能的。但是你可以使用 hex 来使格式更易读。 - user395760
5个回答

24

常规的Python解释器会调用sys.displayhook来显示您输入的表达式。您可以用自己想要的方式替换它,但您必须记住它会被调用来显示交互式解释器想要显示的所有表达式:

>>> import sys
>>> 1
1
>>> "1"
'1'
>>> def display_as_hex(item):
...     if isinstance(item, (int, long)):
...         print hex(item)
...     else:
...         print repr(item)
...
>>> sys.displayhook = display_as_hex
>>> 1
0x1
>>> "1"
'1'

我怀疑你很快就会厌倦看到所有的整数都以十六进制表示,因此你需要根据需要显式地将要看到的整数转换为十六进制。


2
可以将整数同时以十进制和十六进制打印。 - kindall
添加一个简单的enahex()和dishex()到set,并分别恢复displayhook,可以轻松地来回切换。谢谢! - Jonathon Reinhart
1
你可以重写提示显示对象的方式,这太酷了。回答得好。 - I82Much

5

在之前的答案基础上,这里提供适用于Python 2/3的版本,不会将bool值显示为十六进制,并且还可以正确设置_变量:

import sys

def _displayhook(o):
    if type(o).__name__ in ('int', 'long'):
        print(hex(o))
        __builtins__._ = o
    else:
        sys.__displayhook__(o)

def hexon():
    sys.displayhook = _displayhook
def hexoff():
    sys.displayhook=sys.__displayhook__

我不得不删除该行代码 __builtins__._ = o,因为它总是会抛出异常信息AttributeError:'dict' object has no attribute '_', 但是没有了这行代码,现在已经很好地工作了。 - jangxx

3
也许是这样的吧?
class HexInt(int):
    "Same as int, but __repr__() uses hex"

    def __repr__(self):
        return hex(self)

当您创建想要显示为十六进制值的所有整数时,可以使用该方法。

例如:

>>> a = HexInt(12345)
>>> b = HexInt(54321)
>>> a
0x3039
>>> b
0xd431
>>> c = HexInt(a + b)
>>> c
0x1046a

请注意,如果您想在进行算术运算时跳过显式创建新的HexInt,则需要重写现有的int方法版本,例如__add__()__sub__()等,使它们返回HexInt

1
我不认为这比仅仅执行 hex(12345) 更好。 - Craig McQueen

3

修改顶部的Python2答案以适用于Python3...

def display_as_hex(item):
    if isinstance(item, int):
        print(hex(item))
    else:
        print(repr(item))
import sys
sys.displayhook = display_as_hex

2
注意,它将以十六进制形式显示“bool”。 - Craig McQueen

0
你可以像这样做:
while True:
  print hex(input('> '))

要获得一个基本提示,打印出所有结果的十六进制值。你甚至可以将其设置为条件性的——检查input的返回类型是字符串还是数字,如果是,则打印十六进制值,否则正常打印该值。


1
这样的回答。非常适用于REPL。非常有用。哇。 - ratijas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接