通用python模块

时间:2015-02-17 09:00:49

标签: python generics python-module

我有一组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()

谢谢!

1 个答案:

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