如何使用Django模型表示任意函数调用

时间:2014-06-08 17:19:50

标签: python metaprogramming

所以我正在开展一个涉及一些元编程的整洁项目。我希望我的应用程序要做的是允许用户记录动作的“脚本”,其中每个动作严格对应于定义良好的Python库上的单个函数调用(让我们称之为lib_foo)。记录脚本后,应用程序将通过将有序的函数调用列表作为定期任务运行来自动播放。

我的问题是:将任意Python函数调用表示为Django模型的最佳方法是什么?需要考虑* args,** kwargs,类方法等,并将它们表示为模型字段。我天真的做法是这样的:

class Klass(models.Model):
    name = models.CharField(choices=LIST_OF_CLASS_NAMES_IN_LIB_FOO)

class Function(models.Model):
    klass = models.ForeignKey(Klass, null=True)
    name = models.CharField(choices=LIST_OF_FUNCTION_NAMES_IN_LIB_FOO)

class Arg(models.Model):
    function = models.ForeignKey(Function)
    position = models.IntegerField()
    data_type = models.CharField(choices=LIST_OF_SIMPLE_JSON_TRANSLATABLE_DATA_TYPES)

class Kwargs(models.Model):
    function = models.ForeignKey(Function)
    name = models.CharField()
    data_type = models.CharField(choices=LIST_OF_SIMPLE_JSON_TRANSLATABLE_DATA_TYPES)

class FunctionCall(models.Model):
    function = models.ForeignKey(Function)
    periodicity = models.IntegerField() #amount of time in seconds between playbacks

class FunctionCallArg(models.Model):
    function_call = models.ForeignKey(FunctionCall, related_name="args")
    arg_def = models.ForeignKey(Arg)
    value = models.CharField() #again, stick to simple JSON-translatable values here

class FunctionCallKwarg(models.Model):
    function_call = models.ForeignKey(FunctionCall, related_name="kwargs")
    kwarg_def = models.ForeignKey(Kwarg)
    value = models.CharField() #as JSON

所以...我认为这似乎足以记录一个严格约束的函数调用列表进行回放。我想我想问的是:

  • 我忘了什么根本吗?
  • 我是否重新发明了轮子? (即已经有了一个像样的lib)
  • 这整个方法可能真的很愚蠢和天真吗?也许我接近它是完全错误的,如果您认为是这种情况,我希望您告诉我。

0 个答案:

没有答案