Python技术迷

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 全部免费领