首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取没有定义行的Python函数的源代码

获取没有定义行的Python函数的源代码
EN

Stack Overflow用户
提问于 2016-06-27 17:44:17
回答 2查看 812关注 0票数 2

使用inspect.getsourcelines函数,我已经能够获得如下所示的Python函数的源代码:

代码语言:javascript
复制
import inspect    

def some_decorator(x):
    return x

@some_decorator
def foo():
    print("bar")

print(inspect.getsourcelines(foo)[0])

此代码将以列表的形式正确输出函数的源代码行:

代码语言:javascript
复制
['@some_decorator\n', 'def foo():\n', '    print("bar")\n']

但是,我只想要函数内部的代码,而不是整个函数声明。所以我只需要这个输出(还要注意正确的缩进):

代码语言:javascript
复制
['print("bar")\n']

我曾尝试使用一个切片和一个strip来删除前两行,然后删除缩进,但这对许多函数都不起作用,我必须相信还有更好的方法。

inspect模块,或者我可以pip install的其他模块,有这个功能吗?

EN

回答 2

Stack Overflow用户

发布于 2016-06-27 17:53:11

你会发现你想要的代码之前都是空白的,所以你可以试试这个

代码语言:javascript
复制
print filter(lambda x:x.startswith(' '), inspect.getsourcelines(foo)[0])
票数 3
EN

Stack Overflow用户

发布于 2016-06-27 17:59:11

使用re处理defasync def

代码语言:javascript
复制
def_regexp = r"^(\s*)(?:async\s+)?def foobar\s*?\:"
def get_func_code(func):
  lines = inspect.getsourcelines(foo)[0]
  for idx in range(len(lines)):  # in py2.X, use range
      def_match = re.match(line, def_regexp)
      if def_match:
          withespace_len = len(def_match.group(1))  # detect leading whitespace
          return [sline[whitespace_len:] for sline in lines[idx+1:]]

请注意,这不会处理单行定义。需要在def和包含冒号之后匹配左方括号和右方括号(以避免元组和类型提示)。

原始版本:

只需查找包含def语句的第一行。

代码语言:javascript
复制
def get_func_code(func):
  lines = inspect.getsourcelines(foo)[0]
  for idx in range(len(lines)):  # in py2.X, use range
      if line.lstrip().startswith('def %s' % func.__name__) or\
         line.lstrip().startswith('async def %s' % func.__name__):  # actually should check for `r"^async\s+def\s+%s" % func.__name__` via re
          withespace_len = len(line.split('def'), 1)[0]  # detect leading whitespace
          return [sline[whitespace_len:] for sline in lines[idx+1:]]

这应该可以安全地处理制表符和空格缩进,即使在混合情况下也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38050649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档