- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用许多类似 json 的字典。 pprint
可以方便地构建它们。有没有办法使 pprint 输出中的所有整数都以十六进制而不是十进制打印?
例如,而不是:
{66: 'far',
99: 'Bottles of the beer on the wall',
'12': 4277009102,
'boo': 21,
'pprint': [16, 32, 48, 64, 80, 96, 112, 128]}
我更愿意看到:
{0x42: 'far',
0x63: 'Bottles of the beer on the wall',
'12': 0xFEEDFACE,
'boo': 0x15,
'pprint': [0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80]}
我已经尝试自定义 PrettyPrinter
,但无济于事,我是否能够导致上述情况,让 PrettyPrinter.format()
处理整数似乎只对某些人有效整数:
class MyPrettyPrinter(PrettyPrinter):
def format(self, object, context, maxlevels, level):
if isinstance(object, int):
return '0x{:X}'.format(object), True, False
return super().format(object, context, maxlevels, level)
上面的类产生
{0x42: 'far',
0x63: 'Bottles of the beer on the wall',
'12': 0xFEEDFACE,
'boo': 0x15,
'pprint': [16, 32, 48, 64, 80, 96, 112, 128]}
列表内容格式不正确。
最佳答案
您可以改变 pprint
的输出, 但你需要重新实现 saferepr()
function , 而不仅仅是子类化 pprint.PrettyPrinter()
类。
发生的是 saferepr()
的(内部版本)函数用于所有对象,然后该函数本身递归处理将对象转换为表示(仅使用自身,而不是 PrettyPrinter()
实例),因此任何自定义必须发生那里。仅当 saferepr()
的结果时变得太大(对于配置的宽度来说太宽)将 PrettyPrinter
类开始将容器输出分解为组件以放在不同的行上;调用过程saferepr()
然后对组件元素重复。
所以 PrettyPrinter.format()
只负责处理顶级对象,以及每个递归对象 a) 支持的容器类型(dict、list、tuple、string 和它们的标准库子类)和 b) .format()
生成的父容器的表示超出显示宽度。
为了能够覆盖实现,我们需要了解 .format()
是如何实现的方法和 saferepr()
实现交互,他们接受什么参数以及他们需要返回什么。
PrettyPrinter.format()
传递了额外的参数,context
, maxlevels
和 level
:
context
用于检测递归(如果 _recursion(object)
为真,则默认实现返回 id(object) in context
的结果。maxlevels
已设置并且 level >= maxlevels
为真,默认实现返回 ...
作为容器的内容。该方法还应该返回一个包含 3 个值的元组;表示字符串和两个标志。您可以安全地忽略这些标志的含义,它们实际上从未在当前实现中使用。它们旨在表明生成的表示是“可读的”(使用可以传递给 eval()
的 Python 语法)还是递归的(对象包含循环引用)。但是 PrettyPrinter.isreadable()
和 PrettyPrinter.isrecursive()
方法实际上完全绕过了.format()
;这些返回值似乎是打破 .format()
之间关系的重构的延续。以及这两种方法。所以只需返回一个表示字符串和任何您喜欢的两个 bool 值。
.format()
实际上只是委托(delegate)给 saferepr()
的内部实现然后做几件事
context
处理递归检测,以及 maxlevels
的深度处理和 level
__repr__
方法仍然是默认实现)_safe_tuple
解决的近似于 Python 2 的sort everything 行为的排序键。我们可以重复使用它。要实现递归替换,我更喜欢使用 @functools.singledispatch()
委托(delegate)不同类型的处理。忽略自定义 __repr__
方法、处理深度问题、递归和空对象,也可以由装饰器处理:
import pprint
from pprint import PrettyPrinter
from functools import singledispatch, wraps
from typing import get_type_hints
def common_container_checks(f):
type_ = get_type_hints(f)['object']
base_impl = type_.__repr__
empty_repr = repr(type_()) # {}, [], ()
too_deep_repr = f'{empty_repr[0]}...{empty_repr[-1]}' # {...}, [...], (...)
@wraps(f)
def wrapper(object, context, maxlevels, level):
if type(object).__repr__ is not base_impl: # subclassed repr
return repr(object)
if not object: # empty, short-circuit
return empty_repr
if maxlevels and level >= maxlevels: # exceeding the max depth
return too_deep_repr
oid = id(object)
if oid in context: # self-reference
return pprint._recursion(object)
context[oid] = 1
result = f(object, context, maxlevels, level)
del context[oid]
return result
return wrapper
@singledispatch
def saferepr(object, context, maxlevels, level):
return repr(object)
@saferepr.register
def _handle_int(object: int, *args):
# uppercase hexadecimal representation with 0x prefix
return f'0x{object:X}'
@saferepr.register
@common_container_checks
def _handle_dict(object: dict, context, maxlevels, level):
level += 1
contents = [
f'{saferepr(k, context, maxlevels, level)}: '
f'{saferepr(v, context, maxlevels, level)}'
for k, v in sorted(object.items(), key=pprint._safe_tuple)
]
return f'{{{", ".join(contents)}}}'
@saferepr.register
@common_container_checks
def _handle_list(object: list, context, maxlevels, level):
level += 1
contents = [
f'{saferepr(v, context, maxlevels, level)}'
for v in object
]
return f'[{", ".join(contents)}]'
@saferepr.register
@common_container_checks
def _handle_tuple(object: tuple, context, maxlevels, level):
level += 1
if len(object) == 1:
return f'({saferepr(object[0], context, maxlevels, level)},)'
contents = [
f'{saferepr(v, context, maxlevels, level)}'
for v in object
]
return f'({", ".join(contents)})'
class HexIntPrettyPrinter(PrettyPrinter):
def format(self, *args):
# it doesn't matter what the boolean values are here
return saferepr(*args), True, False
这个全手可以处理任何基本的事情pprint
实现可以,并且它将在任何支持的容器中生成十六进制整数。只需创建 HexIntPrettyPrinter()
的一个实例上课打电话.pprint()
对此:
>>> sample = {66: 'far',
... 99: 'Bottles of the beer on the wall',
... '12': 4277009102,
... 'boo': 21,
... 'pprint': [16, 32, 48, 64, 80, 96, 112, 128]}
>>> pprinter = HexIntPrettyPrinter()
>>> pprinter.pprint(sample)
{0x42: 'far',
0x63: 'Bottles of the beer on the wall',
'12': 0xFEEDFACE,
'boo': 0x15,
'pprint': [0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80]}
旁注:如果您使用的是 Python 3.6 或更早版本,则必须替换 @saferepr.registration
符合 @saferepr.registration(<type>)
电话,其中 <type>
在注册函数的第一个参数上复制类型注释。
关于python - pprint 十六进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49565047/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!