【问题标题】:Python: print variable name and value easilyPython:轻松打印变量名和值
【发布时间】:2017-09-06 18:07:15
【问题描述】:

我想使用一个可以自动打印出变量和值的函数。如下图:

num = 3
coolprint(num)

输出:

num = 3

此外,如果它也能做这样的事情会很酷:

variable.a = 3
variable.b = 5
coolprint(vars(variable))

输出:

vars(variable) = {'a': 3, 'b': 5}

现在有没有类似的功能?还是我应该自己做?谢谢

【问题讨论】:

  • 检查 pprint 它可能会做你想做的事
  • Python 不支持这个。函数只能看到对象,而不是变量名。 coolprint 不知道 3 来自名为 num 的变量。
  • 根本不可能精确定位正确的变量,因为您可以有多个变量指向同一个值。
  • import sys; print(sys.getrefcount(0)) 你会明白的。

标签: python printing


【解决方案1】:

从 Python 3.8 开始,f 字符串有一个 =:

#!/usr/bin/env python3
python="rocks"
print(f"{python=}")

这会输出

# python=rocks

【讨论】:

    【解决方案2】:

    这种基于 lambda 的解决方案对我来说已经足够好用了,尽管可能并非在所有情况下都适用。非常简单,只消耗一行。

    coolprint = lambda *w: [print(x,'=',eval(x)) for x in w]
    

    示例..

    coolprint = lambda *w: [print(x,'=',eval(x)) for x in w]
    
    a, *b, c = [1, 2, 3, 4, 5]
    
    coolprint('a')
    coolprint('b','c')
    coolprint('a','b','c')
    coolprint('c','b','b','a','b','c')
    

    产生..

    a = 1
    b = [2, 3, 4]
    c = 5
    a = 1
    b = [2, 3, 4]
    c = 5
    a = 1
    b = [2, 3, 4]
    c = 5
    c = 5
    b = [2, 3, 4]
    b = [2, 3, 4]
    a = 1
    b = [2, 3, 4]
    c = 5
    

    【讨论】:

      【解决方案3】:

      遗憾的是,虽然它可能对许多人有用,但完成这项任务的官方方法并不存在。我会建议并且我过去有时使用过的方法如下(我不确定这是否是最好的方法)。

      基本上,您可以创建一个自定义对象,每次模仿一个 Python 的数据类型。您可以在下面找到整数的示例。

      class CustomVariable(object):
      
          def __init__(self, name, value):
              self.name = name
              self.value = value
      
          def __str__(self):
              return "{} = {}".format(self.name, self.value)
      
          def __add__(self, val) :
              return self.value + val
      
      
      myVar = CustomVariable("myVar", 15)
      print myVar
      myVar = myVar + 5
      print myVar
      

      Output:
      myVar = 15
      myVar = 20
      

      检查名为“___str____”的特殊方法

      【讨论】:

        【解决方案4】:

        我只是附加我的自定义打印,它接受一个列表或一个表达式的字典,在横向情况下添加全局变量(请原谅违反 PEP,我只是喜欢单行,尤其是 lambda):

        pp = lambda p: print(' | '.join([f"{x} = {eval(x)}" for x, v in {**p, **dict(**globals())}.items() if not x.startswith('_')])) if type(p)==dict else print(' | '.join([f"{x} = {eval(x)}" for x in p if not x.startswith('_')]))
        
        # Some Variables:    
        z = {'a':100, 'b':200}
        a = 1+15
        
        # Usage with dict & all the variables in the script:
        pp(dict(**locals()))
        
        # Usage with list, for specific expressions:
        pp(['a', "z['b']", """ {x:x+a for x in range(95, z['a'])} """])
        
        • 请注意,f'{x =}' 将无法正常工作,因为评估在函数内部进行。

        【讨论】:

          【解决方案5】:

          我发现答案是否定的。没有办法做到这一点。但是,最好的选择是这样的:

          from pprint import pprint
          
          def crint(obj, name):
          
              if isinstance(obj, dict):
                  print '\n' + name + ' = '
                  pprint(obj)
          
              else:
                  print '\n' + name + ' = ' + str(obj)
          

          这样你就可以做到:

          crint(vars(table.content[0]), 'vars(table.content[0])')
          

          或:

          j = 3
          crint(j, 'j')
          

          【讨论】:

          • 另一种可能的替代方法是使用映射数据结构,例如字典。
          • 查看我的答案,了解从 Python 3.8 开始的 Python 原生方式:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 2010-12-06
          • 2010-10-02
          • 2012-08-20
          相关资源
          最近更新 更多