python中的自动代码生成

时间:2015-02-18 11:59:31

标签: python code-generation

我需要从python中调用C dll中的函数。所以我需要编写格式

的函数
def funcA(self):
    ans = ctypes.uint64()
    self.driver.getA(ctypes.byref(ans))
    return ans

现在我必须编写相同的代码大约30次,每个的唯一区别是被调用的函数的名称      funcA,funcB,funcC和类似的dll函数getA,getB,getC      以及可以改变的返回值的类型

通常我想要一个字典

funcs = { 'A':'uint64', 'B':'bool'}

并自动生成功能

funcA和funcB,除了类型和变量名之外,其结构与顶部显示的几乎相同。 我猜它会有一些库。

2 个答案:

答案 0 :(得分:3)

为什么要使用字符串而不是类型本身?

funcs = { 'A':ctypes.uint64, 'B':bool }

然后:

def make_func(name, ctype):
    def func(self):
        ans = ctype()
        getattr(self.driver, 'get'+name)(ctypes.byref(ans))
        return ans
   func.__name__ = 'func'+name
   return func

for a, b in funcs.items():
    globals()['func'+a] = make_func(a, b)

或者放弃dict和for循环并且:

funcA = make_func('A', ctypes.uint64)
funcB = make_func('B', bool)

答案 1 :(得分:2)

如果您想通过代码生成执行此操作,则可以为该函数创建一些模板,然后使用str.format填写字典中的参数。

template = """def func{0}(self):
    ans = ctypes.{1}()
    self.driver.get{0}(ctypes.byref(ans))
    return ans
    """

funcs = { 'A':'uint64', 'B':'bool'}

for a, b in funcs.items():
    function = template.format(a, b)
    print function

只需将输出传输到某个文件,或直接将其写入文件而不是打印。