我有一组python模块,它们共享大部分代码,并且具有它们实例化的类的独特差异。
我以为我可以实现一个模板并使用我想要实例化的类来渲染模块,但我认为这不是最好的解决方案,所以我想知道是否有任何方法可以实现通用模块,以避免复制代码。
我的情况的一个例子。
模块A:
from table import BusinessRules
from best_practice import BP_BusinessRule
from query import new_query, _and, _or
def process_BR(conn, args):
query = new_query('active', '=', 'true')
table = BusinessRules(conn)
res = table.get_records(query=query)
for record in res['records']:
bp = BP_BusinessRule(record)
for check in args:
fcheck = getattr(bp, check, None)
if fcheck:
fcheck()
模块B:
from table import ClientScript
from best_practice import BP_ClientScript
from query import new_query, _and, _or
def process_CS(conn, args):
query = new_query('active', '=', 'true')
table = ClientScript(conn)
res = table.get_records(query=query)
for record in res['records']:
bp = BP_ClientScript(record)
for check in args:
fcheck = getattr(bp, check, None)
if fcheck:
fcheck()
我想有一个这样的模块,我不知道如何实现这个目标。
from table import <Generic>
from best_practice import BP_<Generic>
from query import new_query, _and, _or
def process(conn, args):
query = new_query('active', '=', 'true')
table = <Generic>(conn)
res = table.get_records(query=query)
for record in res['records']:
bp = BP_<Generic>(record)
for check in args:
fcheck = getattr(bp, check, None)
if fcheck:
fcheck()
谢谢!
答案 0 :(得分:1)
from query import new_query, _and, _or
def process(table_cls, bp_cls, conn, args):
query = new_query('active', '=', 'true')
table = table_cls(conn)
res = table.get_records(query=query)
for record in res['records']:
bp = bp_cls(record)
for check in args:
fcheck = getattr(bp, check, None)
if fcheck:
fcheck()
然后你可以使用
process(ClientScript, BP_ClientScript, conn, args)
调用该函数,或使用partial
import functools
process_CS = functools.partial(process, ClientScript, BP_ClientScript)
然后只是process_CS(conn, args)
你现在的方式。