Loading...

Python黑魔法手册 2.0 文档第二章魔法命令行【1-5】

Python2年前 (2022)更新 safedragon
83 0

Python黑魔法手册 2.0 文档第二章魔法命令行【1-5】

这个章节是全新的内容,主要介绍的是 Python Shell 的一些冷门玩法,这里面的内容,应该足够让你惊叹。

2.1 懒人必备技能:使用 “_”

对于 _ ,大家对于他的印象都是用于 占位符,省得为一个不需要用到的变量,绞尽脑汁的想变量名。

今天要介绍的是他的第二种用法,就是在交互式模式下的应用。
示例如下:

>>> 3 + 4
7
>>> _
7
>>> name='公众号: Python编程时光'
>>> name
'公众号: Python编程时光'
>>> _
'公众号: Python编程时光'

它可以返回上一次的运行结果。
但是,如果是print函数打印出来的就不行了。

>>> 3 + 4
7
>>> _
7
>>> print("公众号: Python编程时光")
ming
>>> _
7

我自己写了个例子,验证了下,用 __repr__ 输出的内容可以被获取到的。 首先,在我们的目录下,写一个文件 demo.py。内容如下

# demo.py
class mytest():
 def __str__(self):
 return "hello"
 def __repr__(self):
 return "world"

然后在这个目录下进入交互式环境。

>>> import demo
>>> mt=demo.mytest()
>>> mt
world
>>> print(mt)
hello
>>> _
world

知道这两个魔法方法的人,一看就明白了,这里不再解释啦。

2.2 最快查看包搜索路径的方式

当你使用 import 导入一个包或模块时,Python 会去一些目录下查找,而这些目录是有优先级顺序的,正常人会使用sys.path 查看。

>>> import sys
>>> from pprint import pprint
>>> pprint(sys.path)
['',
 '/usr/local/Python3.7/lib/python37.zip',
 '/usr/local/Python3.7/lib/python3.7',
 '/usr/local/Python3.7/lib/python3.7/lib-dynload',
 '/home/wangbm/.local/lib/python3.7/site-packages',
 '/usr/local/Python3.7/lib/python3.7/site-packages']
>>>

那有没有更快的方式呢?

我这有一种连 console 模式都不用进入的方法呢?
你可能会想到这种,但这本质上与上面并无区别

[wangbm@localhost ~]$ python -c "print('\n'.join(__import__('sys').path))"
/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg
/usr/lib/python2.7/site-packages/redis-3.0.1-py2.7.egg
/usr/lib64/python27.zip
/usr/lib64/python2.7
/usr/lib64/python2.7/plat-linux2
/usr/lib64/python2.7/lib-tk
/usr/lib64/python2.7/lib-old
/usr/lib64/python2.7/lib-dynload
/home/wangbm/.local/lib/python2.7/site-packages
/usr/lib64/python2.7/site-packages
/usr/lib64/python2.7/site-packages/gtk-2.0
/usr/lib/python2.7/site-packages

这里我要介绍的是比上面两种都方便的多的方法,一行命令即可解决

[wangbm@localhost ~]$ python3 -m site
sys.path = [
 '/home/wangbm',
 '/usr/local/Python3.7/lib/python37.zip',
 '/usr/local/Python3.7/lib/python3.7',
 '/usr/local/Python3.7/lib/python3.7/lib-dynload',
 '/home/wangbm/.local/lib/python3.7/site-packages',
 '/usr/local/Python3.7/lib/python3.7/site-packages',
]
USER_BASE: '/home/wangbm/.local' (exists)
USER_SITE: '/home/wangbm/.local/lib/python3.7/site-packages' (exists)
ENABLE_USER_SITE: True

从输出你可以发现,这个列的路径会比 sys.path 更全,它包含了用户环境的目录。

2.3 使用 json.tool 来格式化 JSON

假设现在你需要查看你机器上的json文件,而这个文件没有经过任何的美化,阅读起来是非常困难的。

$ cat demo.json
{"_id":"5f12d319624e57e27d1291fe","index":0,"guid":"4e482708-c6aa-4ef9-a45ed5ce2c72c68d","isActive":false,"balance":"$2,954.93","picture":"http://placehold.it/32x32","age":
3237","address":"246IndianaPlace,Glenbrook,Iowa,3896","about":"Velitmagnanostrudexcepteurduisexte
02-06T06:42:20-08:00","latitude":-10.269827,"longitude":-103.12419,"tags":
["laborum","excepteur","veniam","reprehenderit","voluptate","laborum","in"],"friends":
[{"id":0,"name":"DorotheaShields"},{"id":1,"name":"AnnaRosales"},
{"id":2,"name":"GravesBryant"}],"greeting":"Hello,MasseySaunders!Youhave8unreadmessages.","favori

这时候你就可以使用 python 的命令行来直接美化。

$ python -m json.tool demo.json
{
 "_id": "5f12d319624e57e27d1291fe",
 "about":
"Velitmagnanostrudexcepteurduisextemporirurefugiataliquasunt.Excepteurvelitquiseuinexinoccaecatoc
 "address": "246IndianaPlace,Glenbrook,Iowa,3896",
 "age": 36,
 "balance": "$2,954.93",
 "company": "TALAE",
 "email": "masseysaunders@talae.com",
 "eyeColor": "green",
 "favoriteFruit": "apple",
 "friends": [
 {
 "id": 0,
 "name": "DorotheaShields"
 },
 {
 "id": 1,
 "name": "AnnaRosales"
 },
 {
 "id": 2,
 "name": "GravesBryant"
 }
 ],
 "gender": "male",
 "greeting": "Hello,MasseySaunders!Youhave8unreadmessages.",
 "guid": "4e482708-c6aa-4ef9-a45e-d5ce2c72c68d",
 "index": 0,
 "isActive": false,
 "latitude": -10.269827,
 "longitude": -103.12419,
 "name": "MasseySaunders",
 "phone": "+1(853)508-3237",
 "picture": "http://placehold.it/32x32",
 "registered": "2017-02-06T06:42:20-08:00",
 "tags": [
 "laborum",
 "excepteur",
 "veniam",
 "reprehenderit",
 "voluptate",
 "laborum",
 "in"
 ]
}

2.4 命令行式执行 Python 代码

有时候你只是想验证一小段 Python 代码是否可用时,通常有两种方法
1. 输入 python 回车,进入 console 模式,然后敲入代码进行验证
2. 将你的代码写入 demo.py 脚本中,然后使用 python demo.py 验证
其实还有一种更简单的方法,比如我要计算一个字符串的md5

$ python -c "import hashlib;print(hashlib.md5('hello').hexdigest())"
5d41402abc4b2a76b9719d911017c592

只要加 -c 参数,就可以输入你的 Python 代码了。

2.5 用调试模式执行脚本

当你使用 pdb 进行脚本的调试时,你可能会先在目标代码处输入 import pdb;pdb.set_trace()来设置断点。

除此之外,还有一种方法,就是使用 -m pdb

$ python -m pdb demo.py
> /Users/MING/demo.py(1)<module>()
-> import sys
(Pdb)

 

© 版权声明

相关文章

暂无评论

暂无评论...