选择做一个" mini-dsl"用Python?

时间:2015-02-07 16:18:10

标签: python testing dsl

我目前正在开发一个框架,用于在虚拟机中自动配置我们的软件产品,以便在python中进行测试。到目前为止,事情都是面向对象的。框架将创建“目标”对象,然后依赖于目标类型,框架将“动作”添加到列表中;最后这些行动被“执行”。

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

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

最终拥有这些物品真是太好了。因为他们允许我做各种有趣的事情;但另一方面;这种“符号”增加了很多“样板”。某种“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,使用其“默认”AUTOLOAD方法;并且可以使用BEGIN,CHECK等轻松访问各种编译阶段。

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

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你可以概括你的功能:

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")