将 Python 内省推向极限
Pushing Python introspection to limits
简单的问题 – 我可以打印这个 if
的源代码吗?
if __name__ == '__main__':
# ...
# this is the `if` I want to print
# V
if args and args[0][0] == '-':
if args[0] in ('--help','-h','-?'):
print_source_of_block(level=2)
icase = 'i' in args[0]
desc = 'd' in args[0]
args = args[1:]
请不要问我为什么需要它,也不要给我建议如何编写用户帮助。因为好奇所以想知道
可能需要查看 inspect
模块 (https://docs.python.org/2/library/inspect.html)。具体来说,inspect.getsource(object)
方法。
是的,这是可行的。以下是如何执行此操作以及将涉及哪些工具的简要说明:
- 检索
print_source_of_block
的调用者 inspect.currentframe().f_back
的堆栈帧。
- 使用
inspect.getframeinfo
确定调用者的源文件和该源文件中的行号。
- 打开源文件。
- 要么
- 使用
ast.parse
解析文件,或者
- 使用
tokenize.tokenize
对其进行标记化。
- 使用抽象语法树或令牌流,确定请求的源块的开始和结束位置。
- 打印块。
简单的问题 – 我可以打印这个 if
的源代码吗?
if __name__ == '__main__':
# ...
# this is the `if` I want to print
# V
if args and args[0][0] == '-':
if args[0] in ('--help','-h','-?'):
print_source_of_block(level=2)
icase = 'i' in args[0]
desc = 'd' in args[0]
args = args[1:]
请不要问我为什么需要它,也不要给我建议如何编写用户帮助。因为好奇所以想知道
可能需要查看 inspect
模块 (https://docs.python.org/2/library/inspect.html)。具体来说,inspect.getsource(object)
方法。
是的,这是可行的。以下是如何执行此操作以及将涉及哪些工具的简要说明:
- 检索
print_source_of_block
的调用者inspect.currentframe().f_back
的堆栈帧。 - 使用
inspect.getframeinfo
确定调用者的源文件和该源文件中的行号。 - 打开源文件。
- 要么
- 使用
ast.parse
解析文件,或者 - 使用
tokenize.tokenize
对其进行标记化。
- 使用
- 使用抽象语法树或令牌流,确定请求的源块的开始和结束位置。
- 打印块。