gpt4 book ai didi

python - dsl in python example needed like in ruby

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:14 25 4
gpt4 key购买 nike

基本上我是一个 ruby​​ 人,遇到了我需要在 py 中制作一个小型 dsl 的情况,我知道在 ruby​​ 中跟随是可行的,我正在寻找完全相同的 py

from_a_dsl_file = "
take_this 'abc'
and_process_it
and_give_me_the_output
"

class A
def take_this abc
end

def and_process_it
end

def and_give_me_the_output
'desired'
end
end

A.new.instance_eval from_a_dsl_file
# => 'desired'

请提供任何提示或很好的示例

提前致谢

最佳答案

据我了解,在 Ruby 中,您可以使用不需要括号的函数调用来完成一些棘手的事情:

x y

在 Ruby 中,这可能是一个函数调用,其中函数 xy 作为参数调用。

嗯,在 Python 中,我们没有这些技巧;如果你正在调用一个函数,你需要在函数名后加上括号。因此,我认为您为此尝试使用 eval() 玩游戏不会很幸运。

更好的做法是编写一个解析器来为您解析语言并弄清楚该语言试图做什么。为此,Python 有一个特别好的库:pyparsing

http://pyparsing.wikispaces.com/

附言只需在 Google 上搜索“Python 域特定语言”即可找到一些不错的链接,其中很多都在 StackOverflow 中。这是我找到的最好的:

Mini-languages in Python

编辑:好的,你问了一个例子,给你。这是我在 PyParsing 中的第一个程序,它非常简单。我什至没有阅读文档;我只是根据我在网上找到的演示文稿中的示例进行处理。

这是演示文稿的 URL:http://www.ptmcg.com/geo/python/confs/TxUnconf2008Pyparsing.html

from pyparsing import *

def give_desired_output(s):
return "desired"

TAKE_THIS = Suppress("take_this") + Suppress(Word(printables))
AND_PROC = Suppress("and_process_it")
AND_GIVE = Keyword("and_give_me_the_output")
AND_GIVE.setParseAction(give_desired_output)

LANGUAGE_LINE = TAKE_THIS | AND_PROC | AND_GIVE

LANGUAGE = ZeroOrMore(LANGUAGE_LINE)


def parse_language(text):
lst = LANGUAGE.parseString(text)
assert len(lst) == 1 # trivial language returns a single value
return lst[0]

if __name__ == "__main__":
from_a_dsl_file = \
"""
take_this 'abc'
and_process_it
and_give_me_the_output
"""

print(parse_language(from_a_dsl_file)) # prints the word: desired

关于python - dsl in python example needed like in ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14433785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com