文章插图
作者 | 写代码的明哥
来源 |Python编程时光(ID: Cool-Python)
文章插图
如何在运行状态查看源代码?查看函数的源代码,我们通常会使用 IDE 来完成 。
比如在 PyCharm 中,你可以 Ctrl + 鼠标点击 进入函数的源代码 。
那如果没有 IDE 呢?
当我们想使用一个函数时,如何知道这个函数需要接收哪些参数呢?
当我们在使用函数时出现问题的时候,如何通过阅读源代码来排查问题所在呢?
这时候,我们可以使用 inspect 来代替 IDE 帮助你完成这些事 。
# demo.pyimport inspectdef add(x, y):return x + yprint("===================")print(inspect.getsource(add))运行结果如下
$ python demo.py===================def add(x, y):return x + y
文章插图
如何关闭异常自动关联上下文?当你在处理异常时,由于处理不当或者其他问题,再次抛出另一个异常时,往外抛出的异常也会携带原始的异常信息 。
就像这样子 。
try:print(1 / 0)except Exception as exc:raise RuntimeError("Something bad hAppened")从输出可以看到两个异常信息
Traceback (most recent call last):File "demo.py", line 2, in <module>print(1 / 0)ZeroDivisionError: division by zeroDuring handling of the above exception, another exception occurred:Traceback (most recent call last):File "demo.py", line 4, in <module>raise RuntimeError("Something bad happened")RuntimeError: Something bad happened如果在异常处理程序或 finally 块中引发异常,默认情况下,异常机制会隐式工作会将先前的异常附加为新异常的
__context__
属性 。这就是 Python 默认开启的自动关联异常上下文 。如果你想自己控制这个上下文,可以加个 from 关键字(from
语法会有个限制,就是第二个表达式必须是另一个异常类或实例 。),来表明你的新异常是直接由哪个异常引起的 。try:print(1 / 0)except Exception as exc:raise RuntimeError("Something bad happened") from exc输出如下
Traceback (most recent call last):File "demo.py", line 2, in <module>print(1 / 0)ZeroDivisionError: division by zeroThe above exception was the direct cause of the following exception:Traceback (most recent call last):File "demo.py", line 4, in <module>raise RuntimeError("Something bad happened") from excRuntimeError: Something bad happened当然,你也可以通过
with_traceback
方法为异常设置上下文__context__
属性,这也能在traceback
更好的显示异常信息 。try:print(1 / 0)except Exception as exc:raise RuntimeError("bad thing").with_traceback(exc)最后,如果我想彻底关闭这个自动关联异常上下文的机制?有什么办法呢?
可以使用
raise...from None
,从下面的例子上看,已经没有了原始异常$ cat demo.pytry:print(1 / 0)except Exception as exc:raise RuntimeError("Something bad happened") from None$$ python demo.pyTraceback (most recent call last):File "demo.py", line 4, in <module>raise RuntimeError("Something bad happened") from NoneRuntimeError: Something bad happened(PythonCodingTime)
文章插图
最快查看包搜索路径的方式当你使用 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
推荐阅读
- 81个用于日常问题的Python代码片段
- Python量化交易之单品种多策略多账户组合交易,多线程的应用!
- Python骚操作!你还在用PS制作电子签名吗?
- Python自动化有哪些有趣的事情?
- Python求解特征向量和拉普拉斯矩阵
- 用Python连接4个常用数据库的URL写法,你掌握了吗?
- 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
- python爬虫04 | 长江后浪推前浪,Requests库urllib库拍在沙滩上
- Streamlit是python的一个机器学习、数据科学、应用开发框架
- Python-Streamlit库再学习:st.slider和数据可视作图