Python黑魔法手册 2.0 文档第二章魔法命令行【1-5】
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)