使用Python动态创建类型字典

时间:2015-10-20 09:34:58

标签: python django python-2.7 types django-sitemaps

使用python和'type()',我需要重现这个'结构',但动态地:

class Class1(BaseClass):

    def items(self):
        return [
                'abc',
                'def',
                'hij'
                ]

    def location(self, obj):
        return obj


class Class2(BaseClass):

    def items(self):
        return [
                'klm',
                'nop',
                'qrs'
                ]

    def location(self, obj):
        return obj


final_dict = {
    'Class1': Class1,
    'Class2': Class2,
}

以下是我提出的建议:

def get_final_dict():
    list1 = ['abc', 'def', 'hij']
    list2 = ['klm', 'nop', 'qrs']
    final_dict = {}
    final_dict.update({'Class1': type("Class1", (BaseClass,), {"items": lambda self: list1, "location": lambda self, obj: obj})})
    final_dict.update({'Class2': type("Class2", (BaseClass,), {"items": lambda self: list2, "location": lambda self, obj: obj})})
    return final_dict

final_dict = get_final_dict()

请注意,我没有将'lists'作为lambda的一部分包含在内,因为这些是在我的“现实生活”情境中从方法动态生成的。

这适用于这个“原型”,但显然不符合我的“现实生活场景”。

以下是我正在尝试使用Django的站点地图和'django-static-sitemaps':

def get_sitemaps_dicts():

    nb_of_items_sql = 'SELECT count(id) FROM table'
    cursor = connection.cursor()
    cursor.execute(nb_of_items_sql)
    nb_of_items = cursor.fetchone()[0]

    if nb_of_items < 50000:
        nb_of_items = 50000

    all_classes = {}
    for i in range(nb_of_items / 50000):
        print 'item #' + str(i * 50000)

        sql = 'SELECT url FROM table ' \
              'LIMIT 50000 OFFSET %s'

        cursor.execute(sql, [i * 50000])
        items = cursor.fetchall()
        all_items = []
        for item in items:
            all_items.append(item[0])

        all_classes.update({'Items' + str(i): type("Items" + str(i), (Sitemap,), {"items": lambda self: all_items, "location": lambda self, obj: obj})})

    return all_classes

当我设置'sitemaps = get_sitemaps_dicts()'时,我会获得所有站点地图,但它们都是空的(根本没有URL)。但是,如果我将其设置为“原型”,则会使用URL正确生成站点地图。

我这样做'动态列表'的原因是因为静态站点地图插件将遍历每组50k项目的所有集合。如果你有4亿多行,那么生成它会有点长。

0 个答案:

没有答案