所以我正在开展一个涉及一些元编程的整洁项目。我希望我的应用程序要做的是允许用户记录动作的“脚本”,其中每个动作严格对应于定义良好的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
所以...我认为这似乎足以记录一个严格约束的函数调用列表进行回放。我想我想问的是: