通用 python 模块

Generic python module

我有一组 python 模块,它们共享大部分代码,但它们正在实例化的 class 具有独特的区别。

我想我可以实现一个模板并渲染模块 class 我想每次都实例化,但我认为这不是最好的解决方案,所以我想知道是否有任何有一种通用模块来避免重复代码的方法。

我的情况的一个例子。

模块 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()

谢谢!

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) 你现在做的方式。