将方法名称作为函数参数传递

时间:2018-12-19 09:36:26

标签: python django python-3.x

我可能在这里缺少明显的东西,我试图做的是将这个Django视图的一部分提取到一个函数中,因为我多次使用相同的代码:

def method_name(pk, method_name, model_name):
    instance = get_object_or_404(Document, id=pk)
    wb = instance.method_name()
    with NamedTemporaryFile() as tmp:
        wb.save(tmp.name)
        tmp.seek(0)
        stream = tmp.read()
    instance.model_name.save('POPDV.xlsx', ContentFile(stream), save=False)
    instance.save()

我想将model_name传递为方法名称(粗体)。正确的方法是什么? 我的解决方案是致电instance.__getattribute__ ("model_name").save(...)

1 个答案:

答案 0 :(得分:4)

您可以使用getattr通过名称访问属性:

wb = getattr(instance, method_name)()
# ...
getattr(instance, model_name).save(...)

getattr(obj, name)隐式地经历了各种属性查找选项: obj.__getattribute__(name)obj.__dict__['name']obj.__getattr__(name)

通常,您不会直接调用魔术方法。它们通常是内置方法或运算符的钩子,例如iter(obj)呼叫obj.__iter__()len(obj)呼叫obj.__len__()