我目前正在开发一个框架,用于在虚拟机中自动配置我们的软件产品,以便在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”。
答案 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")