【问题标题】:Is there a Python equivalent to Raku's dd (i.e. "tiny data dumper")?是否有与 Raku 的 dd 等效的 Python(即“小数据转储器”)?
【发布时间】:2020-02-03 20:57:19
【问题描述】:

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

another post 中提到了我找到的最接近的值,它将 Python 的 pprint 与 Perl 5 的 Data::Dumper 进行了比较。但是,与dd 不同,它们都不会输出变量的名称。 Raku 中的 dd 最接近 Perl 5 模块 Data::Show 中的 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)}

(顺便说一下,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}"

【问题讨论】:

  • 如果你真的想使用变量名,并且只声明一次,那么你可以利用locals 方法。 def print_var(name): print(f"{name} is {json.dumps(locals()['name'])}")

标签: python


【解决方案1】:

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

那么您最好使用内置调试器pdb

如果您必须依靠调试跟踪(我的不那么秘密的副手 - 请确保您没有将它们签入版本控制)然后在 print 调用中硬编码变量名称不是太糟糕了——毕竟,也许你可以写一些比变量名更具描述性的东西。还有pprint(prettyprint) 模块可以更好地格式化复杂的嵌套数据结构。

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

【讨论】:

    【解决方案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)"
    

    【讨论】:

      猜你喜欢
      • 2013-02-04
      • 2012-11-21
      • 2010-10-30
      • 2018-10-14
      • 2011-02-09
      • 2012-08-26
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      相关资源
      最近更新 更多