用 Python 做 "mini-dsl" 的选项?

Options to do a "mini-dsl" with Python?

我目前正在开发一个框架,用于在虚拟机中自动配置我们的软件产品,以便在 python 中进行测试。到目前为止,一切都是面向对象的。框架将创建 "target" 个对象,然后根据目标类型,框架将 "actions" 添加到列表中;最后这些动作是 "executed".

现在,创建这些操作列表如下所示:

def build_actions():
  cmds = list()
  cmds.append(UploadSshKeys(target.get_ip(), user.get_name())
  cmds.append(RemoteAction("some command"))
...
  return cmds

最后有这些东西真好;因为他们允许我做各种有趣的事情;但另一方面;这种 "notation" 增加了很多 "boilerplate"。拥有某种 "mini-dsl" 感觉会好得多;看起来像:

upload_keys(target.get_ip() ...
remote("some command

以某种方式神奇地构建了底层对象;把它们放在一个列表中;并在最后提供此列表。天真的实现可以只提供这些方法,可能看起来像:

def upload_keys(ip, ...):
  check if there is a list, if not create one
  create the UploadSsh object
  add the object to the list

但说真的 - 对许多不同的命令执行此操作听起来既麻烦又无聊。很多年前我确实用 Perl 创建了一个类似的 DSL,使用它的 "default" AUTOLOAD 方法;以及使用 BEGIN、CHECK 等轻松进入各个编译阶段。

长话短说:我是Python的新手;并寻找有趣的(但仍然很强大!)选项来实现我的 "mini-dsl".

如果我正确理解你的问题,你可以像这样概括你的函数:

def add_action(klass, **kwargs):
    check if there is a list, if not create one
    create the klass object with arguments **kwargs
    add the object to the list    

那么实际的方法就变成了:

def upload_keys(**kwargs):
    add_action(UploadSsh, kwargs)

def remote_action(**kwargs):
    add_action(RemoteAction, kwargs)

那么你可以这样称呼他们:

upload_keys(target.get_ip(), user.get_name())
remote_action("Some command")