dir() 是用来干什么的?
我最近在写 Python 的时候,碰到一个很常见的场景:拿到一个陌生的对象,但根本不知道它能干啥。查文档?可以,但有时候太慢了,还得切来切去。这时候我就会祭出一个神器——dir()。
你可以把 dir() 想成一个“探照灯”,它能帮你快速扫一遍对象身上的所有“装备”,包括方法、属性,甚至 Python 内部的那些特殊方法(就是双下划线开头的,比如 __init__)。
不传参数:看看你兜里都有啥
如果不传任何东西,dir() 会告诉你当前作用域里都有哪些名字。 这就像你突然忘了自己桌子上放了啥,dir() 直接帮你清点。
a = 10
deftest():pass
print(dir())
# 可能输出 ['__annotations__', '__builtins__', ..., 'a', 'test']
带对象参数:快速摸清底细
给 dir() 传个对象,它就会把这个对象的所有方法和属性列出来。
lst = [1, 2, 3]
print(dir(lst))
# 输出会包含 ['append', 'clear', 'copy', 'count', 'extend', ...]
看到 append,你就知道它能追加数据;看到 sort,你就知道它能排序,这比查文档快多了。
搭配 help():直接看说明书
光知道名字还不够,有些方法你不知道参数和用法,这时候就可以 help() 一下。
help(lst.append)
# 会显示 append(x, /) method of builtins.list instance
过滤掉“噪音”
有个小坑是,dir() 会列出一堆以 __ 开头的特殊方法,这些大部分情况下你用不着,看起来还挺乱。
classDemo:
defsay(self):
print("hi")
print(dir(Demo))
# 看到一堆 '__xx__' 的名字
可以简单过滤一下:
[item for item in dir(Demo) ifnot item.startswith("__")]
# ['say']
给 dir() 升级一个“美化器”
我自己写了个小工具,让 dir() 输出更干净,还能显示方法的类型(普通方法、属性、特殊方法)。
defpretty_dir(obj):
attrs = dir(obj)
result = {"methods": [], "attributes": [], "special": []}
for name in attrs:
if name.startswith("__") and name.endswith("__"):
result["special"].append(name)
else:
try:
if callable(getattr(obj, name)):
result["methods"].append(name)
else:
result["attributes"].append(name)
except AttributeError:
result["attributes"].append(name)
print("普通方法:", result["methods"])
print("属性:", result["attributes"])
print("特殊方法:", result["special"])
# 用法
pretty_dir([1, 2, 3])
执行后,你会很清楚:
普通方法: append、clear、sort……属性: __len__之外的普通值特殊方法: __init__、__iter__这种
这样查对象的功能就像开了个“小型对象浏览器”,又快又清楚。
dir() 虽然看起来是新手工具,但熟练用了真能帮你省下很多时间。尤其是在调试、探索第三方库的时候,dir() + help() 这套组合拳,基本可以帮你秒摸清大部分对象的“身世和能力”。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领