首页 > 解决方案 > 是否有与 Raku 的 dd 等效的 Python(即“小数据转储器”)?

问题描述

我想通过检查多个变量来调试我的 Python 代码,输出它们的名称和内容,相当于 Raku dd(Raku 以前称为“Perl 6”):

我发现的最接近的已经在另一篇文章中提到,它将 Pythonpprint与 Perl 5进行了比较Data::Dumper。但是,与 不同dd的是,它们都不输出变量的名称。dd在 Raku 中最接近showPerl 5 模块中的函数Data::Show,除了show额外输出文件名和行号。

这是 Raku 的dd实际演示:

#!/bin/env perl6

my %a = ( :A(1), :B(2) );
my %c = ( :C(3), :D(4) );

dd %a;
dd %c;

运行时,结果如下:

Hash %a = {:A(1), :B(2)}
Hash %c = {:C(3), :D(4)}

(顺便说一下,HashPerl 或 Raku 中的 a 相当于 Python 中的字典)

这是我在 Python 中最接近的版本,但它冗余地需要变量的名称和变量本身:

#!/usr/bin/env python

def tiny_dd(name,x):
    print(name + ' is "' + str(x) + '"')

a = { 'A':1, 'B':2}
c = { 'C':3, 'D':4}

tiny_dd('a',a)
tiny_dd('c',c)

运行时,结果如下:

a is "{'A': 1, 'B': 2}"
c is "{'C': 3, 'D': 4}"

标签: python

解决方案


在打印一个值时重复一个名称两次通常会让那些认为变量具有唯一值的人感到厌烦。然而,在 Python 中,通常很难找到引用特定值的名称,这使得编写像您正在寻找的打印机那样的打印机非常困难,因为您需要在名称空间周围进行一些非常昂贵的检查。

也就是说,PySnooper已经为您完成了所有这些繁重的工作,并且可以打印出关于程序如何运行的大量信息,这对于调试非常有用。

请注意,在 Python 3.8 中,您几乎可以使用 f strings 的=语法获得所需的内容,其工作方式如下(从发行说明中复制):

>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"

推荐阅读