Horizon 中 Python 元编程的例子

Horizon 中创建虚拟机的 workflows 里面有这样一个类,用来选择虚拟机的一些信息,比如配置。GitHub代码

class SetInstanceDetailsAction(workflows.Action):

里面有这几个方法

def populate_image_id_choices(self, request, context):
    images = self._get_available_images(request, context)
    choices = [(image.id, image.name)
               for image in images
               if image.properties.get("image_type", '') != "snapshot"]
    if choices:
        choices.insert(0, ("", _("Select Image")))
    else:
        choices.insert(0, ("", _("No images available.")))
    return choices

def populate_instance_snapshot_id_choices(self, request, context):
    .
    .
    .

def populate_flavor_choices(self, request, context):
    .
    .
    .

这几个方法是用来填充一些页面上的选择框的,看来看去不知道是在哪里被调用的。

于是找父类 workflows.Action

def _populate_choices(self, request, context):
    for field_name, bound_field in self.fields.items():
        meth = getattr(self, "populate_%s_choices" % field_name, None)
        if meth is not None and callable(meth):
            bound_field.choices = meth(request, context)

哈,原来在这里,看出来做什么了吧。太具体的我也还没研究= =

最后,在 __init__ 中有一行。

self._populate_choices(request, context)

看大牛写的高质量代码也有点意思,我想吐槽貌似 Django 的文档不够全面啊,至少跟 Rails 比。


comments powered by Disqus