代码之家  ›  专栏  ›  技术社区  ›  Christopher Bottoms zerkms

有没有一个Python等价于perl6的dd(即“微型数据转储器”)?

  •  0
  • Christopher Bottoms zerkms  · 技术社区  · 5 年前

    我想通过检查多个变量来调试我的Python代码,转储出它们的名称和内容,相当于Raku的 dd (Raku的前身是“perl6”):

    我发现的最接近的 another post ,它比较了Python的 pprint 到Perl 5的 Data::Dumper 详细设计 详细设计 show Perl 5模块中的函数 Data::Show ,除了 显示 另外输出文件名和行号。

    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)}
    

    (顺便说一下,a Hash

    这是我在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 回复  |  直到 5 年前
        1
  •  3
  •   chthonicdaemon    5 年前

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

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

    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)"
    
        2
  •  1
  •   Christopher Bottoms zerkms    5 年前

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

    pdb .

    如果你必须回到调试跟踪(我不是那么秘密的恶习-请确保你没有将它们签入版本控制),那么将变量名硬编码到 print pprint (prettyprint)模块,用于获得复杂嵌套数据结构的更好格式。

    但是如果你真的想在给定一个字符串的情况下找到一个变量 locals() globals() getattr() 内置函数。