Python: 打印变量的名称和值?

28 浏览
0 Comments

Python: 打印变量的名称和值?

在调试过程中,我们经常看到像这样的打印语句:

print x        # 容易输入,但缺乏上下文信息
print 'x=',x   # 更多上下文信息,但输入较麻烦
12
x= 12

如何编写一个函数,它将接受一个变量或变量的名称,并打印出它的名称和值?我只对调试输出感兴趣,这不会被纳入到生产代码中。

debugPrint(x)    # 或者
debugPrint('x')
x=12

0
0 Comments

Python: 打印变量的名称和值

有时候我们需要在调试代码时打印出变量的名称和值,以便于我们更好地了解代码的执行过程和结果。下面是一种方法可以实现这个功能:

def debug(variable):
    print(variable, '=', repr(eval(variable)))

这个方法使用了eval函数来动态地获取变量的值,并通过print函数将变量的名称和值打印出来。你可以将需要调试的变量名作为参数传递给debug函数,然后它会打印出变量的名称和值。

此外,还有一种更加通用的方法可以在调用函数的上下文中工作,并且不会在调用debug('variable')时出错(只在CPython环境下有效):

from __future__ import print_function
import sys
def debug(expression):
    frame = sys._getframe(1)
    print(expression, '=', repr(eval(expression, frame.f_globals, frame.f_locals)))

这种方法使用了sys模块的_getframe函数来获取调用debug函数的上一层函数的上下文,并在该上下文中使用eval函数来获取变量的值。同样地,你可以将需要调试的表达式作为参数传递给debug函数,它会打印出表达式的名称和值。

使用这两种方法,你可以轻松地实现打印变量名称和值的功能。例如:

>>> x = 1
>>> debug('x + 1')
x + 1 = 2

这样就可以打印出变量x加1的结果。

需要注意的是,有些人可能对eval函数的安全性表示担忧。但是这个方法主要用于调试目的,不会用于生产代码中,所以eval函数的安全性并不是一个问题。

此外,还有一些用户提出了这些方法存在的一些问题,比如在某些情况下无法正常工作,或者无法打印局部变量等。但是这些问题在实际使用中并不常见,而且这些方法已经有了更好的替代方案,比如Python 3.8中引入的f-string '='语法。如果你对这些问题感兴趣,可以参考相关的讨论。

总之,这两种方法提供了一种简单而有效的方式来打印变量的名称和值,帮助我们更好地了解代码的执行过程和结果。无论是初学者还是有经验的开发者,都可以从中受益。

0
0 Comments

Python: 打印变量的名称和值

在Python 3.8版本中,添加了f-string的新语法,通过在变量名后面加上"="可以打印出变量的名称和值。例如,在给定以下代码的情况下:

foo = 1
bar = 2
print(f"{foo=} {bar=}")

输出结果为:

foo=1 bar=2

这个新特性是在提交[9a4135e939bc223f592045a38e0f927ba170da32](https://github.com/python/cpython/commit/9a4135e939bc223f592045a38e0f927ba170da32)中添加的,其文档解释如下:

f-strings现在支持"="来快速和方便地调试
-----------------------------------------------------
在f-strings中添加了"="修饰符。`f'{expr=}'`会展开为表达式的文本,一个等号,然后是表达式的repr。所以:
x = 3
print(f'{x*9 + 15=}')
会打印出`x*9 + 15=42`。
因此,它也适用于任意表达式。非常棒!

这个特性类似于JavaScript中的语法,可以通过将变量名放在花括号中来创建字典的键值对。例如,在JavaScript中,以下代码:

let abc = 1
let def = 2
console.log({abc, def})

会展开为`{abc: 1, def: 2}`。这个功能在JavaScript中非常方便,除了用于日志记录之外,在代码的其他地方也经常使用。

在Python中,目前没有类似的语法,除非使用`locals`函数。虽然技术上是可行的,但`print(f'{foo=}')`与OP对`some(foo)`或`some('foo')`的请求相比,会产生更多的标点符号。看起来有些愚蠢,但关键是要有一个非常简单的解决方案,而这个解决方案很容易出错,从而降低了其效果。

此外,使用这个特性还可以获得一个`pylint(logging-fstring-interpolation)`的提示。

总之,Python 3.8版本中的这个特性被称为"self-documenting expressions",它可以方便地打印出变量的名称和值,使代码更加易读和易懂。

但是,如何在循环中遍历kwargs列表呢?由于kwargs是一个字典,所以可以通过调用其`__str__`方法来使用`print(f'{kwargs=}')`来打印出类似`kwargs={'a': 1, 'b': 2}`的结果。但是还有什么其他的功能需要补充呢?

0
0 Comments

Python: 打印变量的名称和值

问题的出现原因:

在Python中,有时候我们需要打印变量的名称和值,以便于调试或查看变量的具体信息。然而,Python的print函数默认只能打印变量的值,无法直接打印变量的名称。因此,我们需要找到一种方法来实现打印变量名称和值的功能。

解决方法:

Python3.8引入了一个新的特性,即使用f-string的形式打印变量的名称和值。我们可以通过在f-string中使用"var ="的语法来实现这一功能。例如,使用f'{a = }'可以打印变量a的名称和值。

然而,如果我们希望将这个功能封装成一个函数,以便在需要的时候直接调用,我们可以按照以下步骤来实现:

Step 1: 创建一个名为debug的函数,该函数接受一个参数var,表示要打印的变量。

Step 2: 在函数内部使用f-string的语法打印变量的名称和值。代码如下所示:

def debug(var):
    print(f'{var = }')

Step 3: 调用debug函数并传入要打印的变量作为参数。例如,调用debug(a)来打印变量a的名称和值。

我们可以通过使用f-string的特性以及封装一个名为debug的函数来实现在Python中打印变量的名称和值的功能。这样可以方便我们进行调试和查看变量的具体信息。

0