使用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亿多行,那么生成它会有点长。