2016-08-23 4 views
1

Есть ли способ изменить способ объекта int типа преобразуется в строку при вызове repr или pprint.pformat, так чтоOverride __repr__ или pprint для Int

repr(dict(a=5, b=100)) 

даст "{a: 0x5, b: 0x64}" вместо "{a: 5, b: 100}"?

Я полагаю подклассы int типа будет вариантом:

class IntThatPrintsAsHex(int): 
    def __repr__(self): 
     return hex(self) 

def preprocess_for_repr(obj): 
    if isinstance(obj, dict): 
     return {preprocess_for_repr(k): preprocess_for_repr(v) for k, v in obj.items()} 
    elif isinstance(obj, list): 
     return [preprocess_for_repr(e) for e in obj] 
    elif isinstance(obj, tuple): 
     return tuple(preprocess_for_repr(e) for e in obj) 
    elif isinstance(obj, int) and not isinstance(obj, bool): 
     return IntThatPrintsAsHex(obj) 
    elif isinstance(obj, set): 
     return {preprocess_for_repr(e) for e in obj} 
    elif isinstance(obj, frozenset): 
     return frozenset(preprocess_for_repr(e) for e in obj) 
    else: # I hope I didn't forget any. 
     return obj 

print(repr(preprocess_for_repr(dict(a=5, b=100)))) 

Но как вы можете видеть, функция preprocess_for_repr довольно неприятно держать «как полные, по мере необходимости» и работать. Кроме того, очевидные последствия для работы.

+1

Нет, нет другого пути. 'pprint' и' repr() '- инструменты отладки, не предназначенные для создания презентаций конечных пользователей. –

+0

В отличие от 'str()', я полагаю? –

+0

да и 'format()' и 'str.format()'. –

ответ

1

Вы должны быть в состоянии обезьяны патча pprint модуля, чтобы иметь целую печать так, как вы хотите, но это не совсем хороший подход.

Если вы просто ищете для лучшего представления целых чисел для отладки, IPython имеет свой собственный довольно принтер, который легко настраивается через pretty модуль:

In [1]: from IPython.lib import pretty 

In [2]: pretty.for_type(int, lambda n, p, cycle: p.text(hex(n))) 
Out[2]: <function IPython.lib.pretty._repr_pprint> 

In [3]: 123 
Out[3]: 0x7b 

In [4]: x = [12] 

In [5]: x 
Out[5]: [0xc] 

In [6]: pretty.pretty(x) 
Out[6]: '[0xc]' 

Вы можете прочитать больше о трех параметров в связанная документация.

2

int - встроенный тип, и вы не можете устанавливать атрибуты встроенных/расширений (вы не можете переопределить и не добавлять новые методы к этим типам). Вы могли бы, однако подкласс int и переопределить метод __repr__ так:

class Integer(int): 
    def __repr__(self): 
     return hex(self) 

x = Integer(3) 
y = Integer(100) 

# prints "[0x3, 0x64]" 
print [x,y] 

Integer будет вести себя так же, как межды, для метода __repr__ исключения. Вы можете использовать его индексные списки, делать математику и так далее. Однако, если вы не измените их, математические операции будут возвращать регулярные int результатов:

>>> print [x,y,x+1,y-2, x*y] 
[0x3, 0x64, 4, 98, 300] 

 Смежные вопросы

  • Нет связанных вопросов^_^