是否有与Raku的dd(即“微型数据转储器”)等效的Python?

时间:2019-10-06 06:14:24

标签: python

我想通过检查多个变量,转储其名称和内容来调试我的Python代码,这些变量和名称和内容等效于Raku的dd(Raku以前被称为“ Perl 6”):

我发现的最接近的词是another post,该词将Python的pprint与Perl 5的Data::Dumper进行了比较。但是,与dd不同的是,这些都不输出变量的名称。 Raku中的dd最接近Perl 5模块Data::Showshow函数,除了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)}

(顺便说一下,Perl或Raku中的Hash等同于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}"

2 个答案:

答案 0 :(得分:2)

在打印值时重复命名两次通常会使认为变量具有唯一值的人感到不满。但是,在Python中,通常很难找到引用特定值的名称,这使得编写像您要查找的打印机的打印机非常困难,因为您需要在名称空间周围进行一些非常昂贵的工作。

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

请注意,在Python 3.8中,您可以通过new = syntax for 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)"

答案 1 :(得分:1)

  

我想通过检查多个变量来调试我的Python代码

那么使用内置调试器pdb可能会更好。

如果您必须依靠调试跟踪(我不是那么秘密,请确保不要将其检入版本控制),然后在print调用中对变量名进行硬编码还算不错-毕竟,也许您可​​以编写比变量名更具描述性的内容。还有一个pprint(prettyprint)模块,用于对复杂的嵌套数据结构进行更好的格式化。

但是,如果您真的希望能够找到一个给定名称的字符串变量,则内置的locals()globals()函数可提供dicts,您可以在其中查找局部变量和全局变量分别。您还可以使用getattr()内置函数按名称查找其他模块的全局变量(属性)(以及具有属性的任何其他属性的属性)。