减少Python代码生成中嵌套函数的缩进

时间:2017-01-26 20:20:39

标签: python

我的目标是动态生成函数,然后将它们保存在文件中。例如,在我当前的尝试中,在呼叫create_file

import io


def create_file():
    nested_func = make_nested_func()
    write_to_file([nested_func, a_root_func], '/tmp/code.py')


def a_root_func(x):
    pass


def make_nested_func():
    def a_nested_func(b, k):
        return b, k

    return a_nested_func


def write_to_file(code_list, path):
    import inspect
    code_str_list = [inspect.getsource(c) for c in code_list]
    with open(path, 'w') as ofh:
        for c in code_str_list:
            fh = io.StringIO(c)
            ofh.writelines(fh.readlines())
            ofh.write('\n')


create_file()

我想要的输出是('/ tmp / code.py'):

def a_nested_func(b, k):
        return b, k

def a_root_func(x):
    pass

我得到的输出是('/ tmp / code.py'):

    def a_nested_func(b, k):
        return b, k

def a_root_func(x):
    pass

a_nested_func缩进。如何减少压痕?我可以做lstrip等等,但我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:3)

使用textwrap.dedent() function删除常见的前导空格:

import inspect
from textwrap import dedent

def write_to_file(code_list, path):
    code_str_list = [inspect.getsource(c) for c in code_list]
    with open(path, 'w') as ofh:
        for c in code_str_list:
            dedented = dedent(c)
            ofh.write(dedented + '\n')

请注意,此处不需要StringIO(string).readlines()舞蹈。

答案 1 :(得分:3)

内置模块textwrap.dedent中有一个功能。

import textwrap
s = """
   abc
     def
"""
s2 = """
abc
  def
"""
assert textwrap.dedent(s) == s2