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