Linux运维进阶-Python,Docker,Shell

python交互模式下小技巧

2020-04-06  本文已影响0人  My熊猫眼

在遇到执行python程序报错的时候,我们很有可能需要到交互模式下去进行排错,在这里介绍几个交互模式下的小技巧,希望能够帮到你:

如果不记得某个模块的名字,用 help("modules KEYWORD") 来通过关键字找到模块的名字;

每个模块都包含有很多的属性和方法,为了过滤出来需要的方法和属性,可以用:
[x for x in dir(MODULE) if x.__contains__(KEYWORDS)] #基于属性的名字过滤;
[name for name,obj in MODULENAME.__dict__.items() if isinstance(obj,types.BuiltinFunctionType) ] #基于属性的类型过滤

如果需要既基于名称,又基于类型来过滤,把两者联合起来使用就可以了.

在默认情况下,交互模式没有启用自动补齐的功能,但是我们可以手动开启,方法很简单:

import readline,rlcompleter  #rlcompleter模块中Completer类的complete方法会返回可能的结果,其被readline模块所使用;
readline.parse_and_bind("tab: complete")    #该语句在rlcompleter的帮助文档中,直接引用就可以

在python的交互模式下,有时候免不了需要查看os下的文件,这时候我们无需退出python交互模式就可以,只需要使用python的os 模块就可以了. 常用os模块中的system 方法: os.system("OS_COMMAND")

查看当前的namespace中相应模块的路径, 直接输入 module的名字就可以了.

在常见的"ImportError: No module named YYY" 之类的错误中,我们有时候会看到 对应发生错误的语句是: import XXX.YYY 之类的,那么怎么理解 XXX.YYY之类的语句呢?
因为 sys.path 支持目录,所以”XXX.YYY“ 表示 XXX目录下的YYY.py 文件,理解这一点很重要. 因为 导入的时候,查找的模块名称如果和目录匹配的话,那么会调用目录下的 __init__.py 来完成初始化,此时导入的模块对应的文件是 __init__.py ,这个文件甚至可以是一个空的.py文件;
而我们知道每一个文件都可以导入为一个模块,因此,该目录下的其他.py文件要导入为模块的时候就需要用: XXX.YYY这种模式,而如果有多层子目录,那么就变成了: XXX.YYY.ZZZ... 这种模式, 这些都是合法的用法.

在导入模块的时候,会发生初始化,在这个初始化的过程中:
普通函数的定义,类的定义等都不会被执行,但是 @FUNCTION 会被执行, 全局的执行语句也会被执行。 理解这些才能够进一步理解模块导入过程发生了什么. 从而才能更好的进行排错.

本文原创,转载请著名出处

上一篇下一篇

猜你喜欢

热点阅读