python 中的自动代码生成
Automatic code generation in python
我需要从 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
以及可以变化的 return 值的类型
通常我只想听写
funcs = { 'A':'uint64', 'B':'bool'}
并自动生成函数
funcA 和 funcB,除了类型和变量名外,结构与上图几乎相同。
我猜会有一些图书馆。
如果你想通过代码生成来做到这一点,你可以只为函数创建一些模板,然后使用 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
只需将输出通过管道传输到某个文件,或直接将其写入文件而不是打印。
为什么使用字符串而不是类型本身?
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)
我需要从 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 以及可以变化的 return 值的类型
通常我只想听写
funcs = { 'A':'uint64', 'B':'bool'}
并自动生成函数
funcA 和 funcB,除了类型和变量名外,结构与上图几乎相同。 我猜会有一些图书馆。
如果你想通过代码生成来做到这一点,你可以只为函数创建一些模板,然后使用 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
只需将输出通过管道传输到某个文件,或直接将其写入文件而不是打印。
为什么使用字符串而不是类型本身?
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)