🙀 WAT
深入检查Python对象。
WAT是一个强大的检查工具, 允许你在运行时深入探索和检查未知对象。
"Wat"是英语单词"what"的变体,常用于表达困惑或厌恶
如果你发现自己深陷在Python控制台中,感到迷失和困惑,
并且在想"WAT?这是什么东西?",
这时wat
检查器就派上用场了。
启动Python解释器(或连接到一个解释器),对任何对象
执行wat / object
,
以调查其
类型、格式化值、变量、方法、父类型、签名、
文档,甚至源代码。
或者,你可以使用wat(object)
语法。
导入
即时加载
如果你想快速调试某些内容, 你可以在同一会话中无需安装任何东西就使用这个检查器。 通过将此代码片段粘贴到您的Python解释器中来动态加载:
import base64, zlib
代码 = 你是一位专门从事英语到中文翻译的语言学专家。 这是一个英语到中文的翻译,请为这段源文本提供中文翻译。 除了翻译外,不要提供任何解释或其他文字。 注意:翻译需要符合中文语序、流畅、通顺 需要翻译的源文本被包裹在XML标签中,如下:
当你的世界崩塌时,请记住这些话:
-
这只是暂时的。没有什么是永恒的,包括你现在的感受。
-
你比你想象的更坚强。你已经度过了许多艰难时刻,这次也不例外。
-
每一次失败都是一次学习的机会。试着从中汲取教训,让自己变得更好。
-
生活中总有起起落落。低谷之后必有高峰。保持希望,相信美好终会到来。
-
你并不孤单。寻求帮助并不可耻。与亲朋好友倾诉,或寻求专业人士的帮助。
-
关注你能控制的事情。有些事情超出了你的掌控范围,把精力集中在你能改变的事情上。
-
照顾好自己。确保充足的睡眠、健康的饮食和适度的运动。
-
保持感恩的心态。即使在最艰难的时刻,也要试着找出值得感恩的事物。
-
给自己一些时间。痊愈需要时间,不要对自己太苛刻。
-
相信自己。你比你想象的更有潜力和能力。
记住,每一个挑战都是成长的机会。保持坚强,相信自己,你终将度过难关,变得更加坚强。
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
6eOEF840p2+Ve2ff/nsL9Cu85LJfwGvPQFk'
在全局命名空间中执行经过base64解码和zlib解压缩后的代码
现在你可以使用 wat
对象。
[!警告] 在执行 Insta-Load 代码片段之前,建议验证你即将运行的内容。 你可以选择:
- 事先验证提取的代码内容:
print(zlib.decompress(base64.b64decode(code)).decode())
- 将 inspection.py 的内容粘贴到你的解释器中。 效果相同。
- 使用 pip 安装包并查看代码。
使用 pip 安装
或者,安装 wat-inspector 包并从 wat 模块导入检查工具:
pip install wat-inspector
import wat
此包没有依赖项。
用法与修饰符
wat
对象可以通过使用除法运算符(无需括号,便于快速输入)快速检查事物。
简短语法 wat / foo
等同于 wat(foo)
。
你可以使用以下修饰符调用 wat.modifiers / foo
:
.short
或.s
隐藏属性(对象内部的变量和方法).dunder
显示双下划线属性(以__
开头).code
显示函数、方法或类的源代码.long
显示未缩写的值和文档字符串.nodocs
隐藏函数和类的文档.caller
显示检查是如何以及在何处被调用的(适用于文件,不适用于 REPL).all
包含所有可用信息.ret
返回被检查的对象.str
返回输出字符串而不是打印它.gray
禁用控制台中的彩色输出
你可以链式使用修饰符,例如 wat.long.dunder.nodocs / foo
。
调用 wat.locals
或 wat()
检查本地变量。
调用 wat.globals
检查全局变量。
在解释器中输入 wat
以了解更多关于这个对象本身的信息。
有几种等效的替代语法。选择最适合你的一种:
wat.short / 'foo' # 快速输入
wat.short('foo')
wat('foo', short=True) # 自然的 Python 语法
'foo' | wat.short # Unix 管道风格
用例示例
确定类型
在 Python 这样的动态类型语言中,通常很难确定对象的类型。WAT Inspector 可以通过显示类型名称及其所在模块来帮助你。
>>> wat.short / (1,)
值:(1,)
类型:tuple
长度:1
>>> wat.short / {None}
值:{None}
类型:set
长度:1
>>> wat.short / user
字符串表示:admin
repr 表示:<User: admin>
类型:django.contrib.auth.models.User
父类:django.contrib.auth.models.AbstractUser, django.contrib.auth.base_user.AbstractBaseUser, django.contrib.auth.models.PermissionsMixin, django.db.models.base.Model, django.db.models.utils.AltersData
现在你已经确定了实际类型,可以在代码中添加类型注解以减少进一步的混淆。
查找方法
通过列出方法及其签名和文档字符串,你可以轻松理解如何使用未知对象。
wat / ['foo']
如果你想查看完整的文档字符串,请使用 wat.long
。
发现函数签名
查看函数的文档字符串和签名,了解如何使用它。
wat / str.split
查找属性
列出属性及其类型,了解被检查对象内部的真实情况。
wat / re.match('(\d)_(.*)', '1_title')
探索模块
另一个用例是探索模块。你可以列出选定模块的函数、类和子模块。
import pathlib
wat / pathlib
然后,你可以进一步导航,例如 wat / pathlib.fnmatch
。
探索双下划线属性
默认情况下,WAT Inspector 隐藏以 __
开头的属性。使用 wat.dunder
来查看它们。
wat.dunder / {}
查看代码
查看函数的源代码,了解它的实际工作原理。
wat.code / wat.__call__
美化不可读的集合
嵌套的字典和列表会得到漂亮的格式化、缩进输出:
使用断点调试
你可以使用 Python 的 breakpoint()
关键字在程序中启动交互式调试器。连接到解释器并现场检查事物。
(Pdb) import wat # 或粘贴 Insta-Load 代码片段
(Pdb) wat / foo # 检查本地变量
...
(Pdb) c # 继续执行
查找本地变量
使用 wat.locals
或 wat.globals
分别查找本地和全局变量。
学习 Python
通过这些代码片段,你可以更好地理解 Python 内部机制。
reversed([]) == reversed([])
# False
wat.s / reversed([])
# 值:<list_reverseiterator object at 0x76749d1cb400>
# 类型:list_reverseiterator
wat / type('ObjectCreator', (), {})
# 值:<class '__main__.ObjectCreator'>
# 类型:type
# 签名:class ObjectCreator()
wat / type
# 值:<class 'type'>
# 类型:type
# 签名:class type(…)
# """
# type(object) -> 对象的类型
# type(name, bases, dict, **kwds) -> 一个新的类型
# """
#
# 公共属性:
# def mro(self, /) # 返回一个类型的方法解析顺序。
from typing import List
wat.s / List[str]
# 值:typing.List[str]
# 类型:typing._GenericAlias
# 父类:typing._BaseGenericAlias, typing._Final
# 签名:def List(*args, **kwargs)
wat(str | None)
# 值:str | None
# 类型:types.UnionType
探索 Python 内置函数:
wat / __builtins__
wat / ...
检查 WAT 自身
wat.dunder / wat
wat.code / wat.__truediv__
环境变量
WAT_COLOR="false"
禁用控制台中的彩色输出。WAT_COLOR="true"
强制在非 tty 环境中也使用彩色输出。
参考
- 灵感来源于 Rich Inspect