VSCode python将对象打印为对象而不是字符串,类似于node.js

plicqrtu  于 2023-06-22  发布在  Node.js
关注(0)|答案(3)|浏览(150)

VSCode,node.js脚本,运行调试器,最后一行有断点:

const obj = { key1: 'value1', key2: 'value2' };
console.log(obj);
console.log(JSON.stringify(obj));
console.log('');

在交互式控制台中生成以下内容:

注意,第一输出是具有可折叠细节的灰色对象,第二输出是其文本版本。
VSCode,python脚本,运行调试器,最后一行有断点:

obj = {'key1': 'value1', 'key2': 'value2'}
print(obj)
print('')

在交互式控制台中生成以下内容:

即对象的. string版本(如node.js中的console.log(JSON.stringify(obj))
如果python脚本仍在运行(在断点处暂停,或者坐在那里听,或者处理一些东西),我可以在交互式控制台中输入obj,它会产生这样的结果(在交互式控制台中):

即具有可折叠细节的灰色对象
但我似乎找不到任何Python函数可以通过编程方式生成最后一个结果(而不是手动将其输入控制台)。我在脚本中简单地尝试了obj,但该行没有输出。
我的问题是:有没有这样的功能?我怎样才能让一个python脚本/应用程序在交互式控制台中输出灰色的可折叠对象,而不仅仅是它的字符串表示?
谢谢!

几个小时后更新-为什么我需要这个?

通常我尽量不添加太多的细节,问题/职位是TL;医生,但是...在与Jialedu的聊天中,他问我为什么要特别做我要求的事情。所以...
我的示例脚本显然非常简单--只是为了说明我想要的问题。
我的实际应用程序很复杂。当然,有些是node,有些是python。在这两种情况下,它循环了大量的数据,做了大量的处理,我希望它在每次循环的迭代中处理它们之前和之后,打印出它正在处理的一些对象的一些子集。所有这一切也穿插着其他信息。
我有一个节点脚本来完成大部分工作。它持续运行,并以折叠的形式打印这些对象,因此它很简短,不会压倒控制台的视图。当它运行时,我可以一眼看到发生了什么。但是,当我看到一些可能被破坏或出于某种原因感兴趣的东西时,我可以在控制台中与它交互(上下折叠它的一些部分等),即使脚本继续运行。
当脚本运行或结束时,变量面板不显示任何内容。只有暂停的时候才会显示。我做的事时间紧迫。我在真实的分析金融图表。如果我用一个断点暂停脚本,那么它会在暂停时错过需要收集(真实的)的信息,以便在它之后(及时)的任何事情都有意义。如果没有这些,调试这个的某些方面要困难得多。
因此,我需要能够在脚本运行的大部分时间内看到缩略折叠形式的输出,而不必暂停它,然后能够跳到我看到的可能是问题或其他问题的东西,并与之交互,而脚本继续运行,而不必暂停它与输出交互。
我可以在Node中完成所有这些。效果很好。
但我的应用程序中有一些特定但类似的功能,需要用python编写,而不能用node/JavaScript完成。所以我用python写的,我需要在它运行的时候真实的分析它在做什么,所有的方式都和node一样。
希望这能帮上忙。

5vf7fwbs

5vf7fwbs1#

如果不设置断点,则调试代码的结果与运行代码的结果相同。
简单地运行代码自然只输出结果,为什么需要在结果中显示过程的变量?这是不合理的。
如第一张图所示,如果不设置断点,将不会显示中间变量。
就是这样,没有断点来挂起调试,自然也看不到进程中存在的对象及其变量。

cetgtptt

cetgtptt2#

我在很多地方都问过这个问题(包括官方的VSCode-python支持),不幸的是,通用的答案似乎是:
这是不可能做到的,至少在没有我们[VS Code python扩展开发人员]为它构建自定义函数的情况下是不可能做到的。
好吧

ylamdve6

ylamdve63#

使用str()和repr()方法的实现。您可以在类中定义它们以获取有关对象的信息(请参阅https://www.digitalocean.com/community/tutorials/python-str-repr-functions)。

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age
    
    def __str__(self):
        return f'The creature type is {self.name} and the age is {self.age}'

    def __repr__(self):
        return f'Ocean(\'{self.name}\', {self.age})'

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

相关问题