建议为python添加新运算符,为分层数据添加语法糖.

我想扩展python,以便您可以创建层次 树结构(XML,HTML等)更容易 比今天使用ElementTree之类的软件包写作更可读性 和xist. 我不想更换包裹,但是包裹可以与 这 新的操作员和由此产生的恕我直言更具可读性. 我想要的语法类似于以下内容: #示例创建HTML树 '*!*'是创建新节点的操作员, '*=*'是设置属性的操作员. 因此,如果您以示例来构建Smalle网页 并与现在在元素树中的外观进行比较 以及abover操作员存在时的外观. 带有元素树包. #建立树结构 root = et.element(" html") head = et.subelement(root," head") title = et.Subelement(头,"标题") title.text ="页面标题" 身体= Et.Subelement(root,"身体") body.set(" bgcolor"," #ffffff") body.text ="你好,世界!" 与句法糖: #建立树结构 root = et.element(" html") *!*根: *!*head(" head"): *!*标题("标题): *=*text ="页面标题" *!*身体("身体"): *=*bgcolor =" #ffffff" *=*text ="你好,世界!" 我认为,随着添加的语法,您可以更好地了解HTML 页. 重复事物消失,您会得到与之相对应的缩进 那个树. 我认为这是非常卑鄙的恕我直言. 可以做到很通用. 如果是变量,请在"*!*"之后对象. 必须支持附加 方法,如果您使用'*=*',它必须支持__setitem__ 任何意见?

# 回答1

格洛姆德写道: 鉴于python没有句法糖 普遍作为正则表达式,不难预测 这个建议的运气. 祝你好运,将其推向前进. 乔治
# 回答2

Glomde Schrieb: 这很丑陋,并且可以使用内置的培养地轻松实现,列表 和词典以及简单的遍历函数. 这样(未经测试): 类节点(对象): def __init __(自我,价值): self.value = vallue self._childs = [] def append(自我,孩子): self._childs.append(儿童) t =('root', ('child1, ('孙子',()), 'child2', () ) ) def create_node(t): 价值,childs = t n =节点(值) 如果孩子: 对于CH的孩子: n.append(create_node(ch)) 返回n 恕我直言,基于元组的树比您的建议更可读 - 而且无需提出新的语法. diez
# 回答3

" glomde" 写道: 添加新的标点符号来处理特定类型非常 联合国情调. - - \"一件事情的成本是我所说的生活的数量| `\需要立即或长时间换取它. _o__)运行." - 亨利·戴维·梭罗| 本·芬尼
# 回答4

格洛姆德写道: 寻找Pyyaml. 这可能是您想要的. - 斯科特·戴维·丹尼尔斯(Scott David Daniels) 有一些差异非常重要. 首先我不 t SE您如何设置该属性和 然后,我看不到如何将Python代码与创建混合. 那么您如何做到这一点: root = et.element(" html") *!*根: *!*head(" head"): *!*标题("标题): 因为我在各节中: !*! 部分(): *=*text =部分[i]
# 回答5

但是,创建节点时,您不能将Python代码混合在其中. 那时候它变得非常丑陋,这是我的不可行的. 但是我也很高兴地认为这是这样的: #建立树结构 root = et.element(" html") *!*根: *!*head(" head"): *!*标题("标题): *=*text ="页面标题" *!*身体("身体"): *=*bgcolor =" #ffffff" *=*text ="你好,世界!" 尤其是如果您开始拥有更深的层次. 但是大 其他优先是你可以 在Beetweed中有任何Python代码.
# 回答6

实际上我们确实从YAML开始,但意识到我们需要拥有 动力 编程语言同样的语言. 但我想提出 看起来的东西 非常接近YAML,因为我发现它很可读. 我已经实施了语法,但是作为Python的预处理器 工作非常好. 干杯, t
# 回答7

格洛姆德写道: 您可以将任何python表达式放在那里,在节点类中可以做 你想要什么. 似乎您正在追求一个模板系统. 好吧,有很多 可用,包括您的. 预处理器不过是模板系统 - 例如,请参见turbogears-putilized Kid(http://kid.lesscode.org/) 生成Python文件. 而且更可读性,因为您正在工作 您的应用程序的域(HTML)而不是某些原油语法 既不是鱼或肉. 反问题:您如何创建这个:

<头> <标题py:content =" title" /> <身体bgcolor ="蓝色" text =" Yellow">

diez

# 回答8

格洛姆德写道: 我个人不喜欢嵌套的托架类型的代码类型 其他答复,我认为您的建议具有一定的吸引力 - "什么 你看到的是你的意思'. 但这不是python. 您还重复自己:头("头"),标题("标题"),身体("身体") 那这个呢: #建立树结构 root = et.element(" html") !根 !头 !标题 如果a为真的: &text ="页面" 别的: &text ="页面B" !身体 &bgcolor =" #ffffff" &text ="你好,世界!" 嗯... Yamlthon? yython ... :-) 一切顺利 Gerar D
# 回答9

格洛姆德写道: 的确 !-) - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答10

[glomde] 是:这是丑陋和不必要的. 您为什么要更改语言语法只是为了使其更容易 直接在程序代码中表达标记? JavaScript只是做到了 与e4x的错误:恕我直言,它是一些最丑陋的代码. E4x 让我想起了Microsoft B*Stardisation,XML数据岛. http://www.w3schools.com/e4x/e4x_howto.asp http://en.wikipedia.org/wiki/e4x 对于直接在Python中代表标记的不错的Pythonic解决方案 代码,您应该检查Stan. http://divmod.org/users/exarkun/nevo...an-module.html 这是一个很好的Stan示例,取自Kieran Holland的教程http://www.kieranholland.com/code/do...on/nevow-stan/ adocument = tags.html [ 标签[头[ tags.title ["你好,世界!"] ],, tags.body [ tags.h1 ["这是一个完整的XHTML文档,以Stan建模." ],, tags.p ["此文本在段落标签内." ],, tags.div(style ="颜色:蓝色;宽度:200px; background-color: 黄色;") [[ "这是一个彩色的div." 这是给予的 这是给予的 这是给予的 看起来不错又简单,无需破坏 python做到这一点. 问候, - - 艾伦·肯尼迪 ------------------------------------------------------------------------------------ ------ 电子邮件alan:http://xhaus.com/contact/alan
# 回答11

>您可以将任何python表达式放在那里,在节点类中可以做 我建议的是所有层次的数据. 不仅是html. 我 不要将其用于创建HTML. 模板系统具有缺点IMO 您获得的代码越多,它就越难以理解. 如果代码 部分很小,它们非常好. 另一部分是凹痕,语法突出显示等等 使用此类代码时不太好. 我会将您的榜样转换为以下. 我认为更多 可读性,因为您会看到Python代码的流动要容易得多. 我意识到 您真的应该执行元素(" html")而不是html(" html") 在我的语法和使用ElementTree中添加节点. 从Urllib导入urlopen 来自ElementTree.ElementTree导入解析,ToString feed ='http://naeblis.cx/rtomayko/weblog/index.atom' root = parse(urlopen(feed)).getRoot() ns ='{http://purl.org/atom/ns#}' title = root.findtext(ns +'title') root = et.element(" html") *+* root: *+*元素(" head"): *+*元素("标题") *+*元素("身体"): * =* bgcolor ="蓝色" * =* text ="黄色" *+*元素(" table"): * =* cellpadding =" 4" * =* CellSpacing =" 4" 对于我,以枚举(根)入门: *+*元素(" tr"): 如果entry.tag == ns +'entry': *+*元素(" TD"): * =* bgcolor =('White','Yellow')[I% 2] *+*元素(" a"): * =* href = entry.find(ns + 'link').attrib ['href'] * =* text =" entry.findtext(ns +) '标题')" 使用以上内容,您可以使用您喜欢的编辑器进行编码和 获得凹痕,语法突出显示等等. 我发现可以 具有模板系统Especia的负担 lly越多的代码 在那里. 使用模板系统时,比较比较更容易调试.
# 回答12

>您还重复自己:头("头"),标题("标题"),身体("身体") 猜猜我在预处理之前对文件的后缀有什么? ..... pyml ofcourse.
# 回答13

>如何将

数据

用于节点,而属性'='呢? 的确 !-) 我认为这不是很好的Pythonic :-). 您不使用Endtags,然后您 不要使用':' 标记您嵌套一个级别. :-) 而且我看不到允许在哪里放置真正的Python代码. 那么,您能以for循环显示一个例子吗? :-)

# 回答14

>这是一个很好的Stan示例,取自Kieran Holland的教程 我快速看了一下,只要您的页面是静态的,它看起来就不错. 但是我不能 SE创建树时如何混合Python代码无缝. 但是如果您可以写信,我可能错了: tags.body [ 对于我在范围(10)中: tags.h1 ["标题%s". %(一世) ], tags.p ["此文本在段落标签内." ],, 这是给予的 我认为这与我的语法足够近. 但是我不认为你 可以做到.
# 回答15

Glomde写道:确实! - ) 我认为这不是很好的Pythonic :-). 添加丑陋和不直觉的"操作员"来尝试转向通用 编程语言成半折的无法使用的HTML模板 语言当然是 *很多 *更多的Pythonic ... 我认为您将获得更多的成功,以将其添加到 perl! - ) - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答16

Am Donnerstag 18 Mai 2006 13:27 Modulix的Schrieb Bruno: 写一个翻译成python的迷你语言怎么样? 考虑到 Cheetah,这是完全这样做的(尽管不限于模板HTML 数据). 将这些操作员添加到Python是绝对的Nono,因为它是 OP在这里试图实现的一般一般. 创建一个小型包装纸 语言:为什么不呢? (这不是我们有足够的模板语言 已经 ;-)) 顺便说一句:您(OP)试图在此处实施的语言进行 严格反对应用程序编程的MVC模型. 你知道的, 正确的? --- Heiko.
# 回答17

>添加丑陋和不直觉的"操作员"来尝试转换通用 它不仅适用于HTML. 我确实认为HTML和XML是最大的 创造者 层次层. 但这对任何包裹都可以 操纵, 创建分层数据. 我以html为例,因为它很好 示例和 大多数人会理解意图. 但是,您能详细说明您的评论是无法使用的. 你 认为所有模板系统都无法使用或什么是特定原因 您认为我的建议是不可用的吗? IMO是YML和Python之间的混合. YML有一个优势 可以通过许多编程语言阅读,但缺点是 这是静态的.
# 回答18

>写一个迷你语法 GE转换为Python? 考虑到 ???. 我看不到这是如何打破MVC的. MVC取决于您的使用方式 你的申请 这不会对您如何进行申请施加任何限制.
# 回答19

格洛姆德写道: 什么是"非等级的高级毁灭"? 一个列表 ?-) 但这将适用于任何操纵,创建层次数据的软件包. fwiw,文件系统是树,大多数RDBM都使用btrees,几乎所有OO 程序是对象的图 - 树是图的子集. 奇怪的是,与树木一起工作并不是什么新鲜事物,看来 几乎任何人都设法在没有隐秘的"操作员"东西的情况下通过. 我以HTML为例,因为这是一个很好的例子,大多数人会理解意图. 对不起,愚蠢. 但是,您能详细说明您的评论是无法使用的. 询问所有从Perl转换为Python的编码人员,为什么他们这样做... 您认为所有模板系统都无法使用吗 不 - 我每天都使用模板系统. 请不要误解:肯定有一些事情要轻松 声明性XML样(包括JSON,YAML等...)数据架构 建造. 但是我认为pythonic的路将依靠 元编程 - 不使用丑陋的Perlish语法. - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答20

格洛姆德写道: 猎豹也不是. Django的模板系统也不是. 也没有其他 Python模板系统. 它可用于所有层次数据. 示例:myList = [] *+ * myList: *+ * []:对于范围(10): *+ * I *+ * {}:对于range(10): * = * i = i = i = i = i = i = i = i 甜蜜的主,有怜悯! 应该创建myList = [[0..9],{0:0,... 9:9}] myList = [ 范围(10), dict((i,i)为i在范围(10)中) 这是给予的 让我们谈谈可读性... 我确实认为我解决了一些问题,并使其更具可读性. 哈哈. 周围有Perl编码员吗? - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答21

Am Donnerstag 18 Mai 2006 15:17 Schrieb Glomde:定义通用:-). 我确实认为我解决了一些问题,并使其更具可读性. 您还可以争辩说,列表理解并不能解决任何一般性. 当然,列表理解解决了一般的问题. 这是句法糖 循环中的经常性图案. 您要实现的目标是制作句法糖来制作名称空间 定义看起来更好. 但是:您尝试这样做的方式不是Pythonic, 因为没有一种明显的方法如何运作; 你什至没有 指定您语法的适当语义解释(并使用"魔术" 标记,甚至是Nono). 为了进行更好的思考提案(IMHO),用于堆叠和定义名称空间 (基于当前的元群行为),在" make"上寻找PEP 关键字(一周已发送到PY-DEV s前). ???. 我看不到这是如何打破MVC的. MVC取决于您如何应对应用程序,这不会对您的应用程序进行任何限制. 当然可以. 如果您实现一种模板语言,该语言简单地包含"完整" Python语言的力量,您基本上创建了一个(某种)易碎的PHP. MVC的视图部分不应进行分支(嗯,严格的意义 MVC),不应该进行循环,不应对数据进行修改,所有这些 东西取决于控制器. 如果您用Python的全部力量授权模板作家 通过将您的建议与Python本身整合在一起,您是 绑定到三个之间的分裂,并创建维护 噩梦(正如我所说,PHP想到了,您基本上无法分裂 正确来自模型的控制器). 对于正确(非常严格)的MVC模板语言,请看一下 内伏. --- Heiko.
# 回答22

我在这里回答你们两个帖子... 让我们谈谈可读性... 我的代码只是表明该提案不仅适用于HTML 一代,但可以在您想创建复杂时使用 层次数据架构. 在上面的示例中,我当然会使用您所写的内容. 我需要向您展示一个不能使用样式的示例 显示? 奇怪的是,与树木一起工作并不是什么新鲜事物,而且似乎几乎任何人都在没有隐秘的"操作员"东西的情况下就可以通过. 几乎任何人都在没有python的情况下就可以通过...很奇怪... :-)抱歉愚蠢. 这不是您的错:-)询问所有从Perl转换为Python的编码人员为什么这样做... 您似乎真的有Perl的东西... 从你写的东西我认为你的意思是不好,因为你 找到语法隐秘. 对我来说,隐秘是你在佩尔中的方式 创建列表,即 需要一段时间才能理解以及您一段时间以来没有完成 您必须重新学习. python有一些同等的人...但是你 真的 仅在做事时需要它们... IMO我建议的不是隐秘,因为 *我认为在解释后,理解是没有问题的 这个怎么运作. *它没有奇怪的副作用 *没有破坏任何旧代码. *如果您没有一段时间,就不必重新学习. 另外,如果您以前从未见过这样的代码,我想您会 理解 是什么意思,甚至能够修改它.
# 回答23

>您要实现的目标是制作句法糖来制作名称空间 我的提议可能与"制造" PEP相同,但事实并非如此 一般的... 但是我会尝试将其更加正式化. 我建议两个新的关键字"节点"和" attr". 有 句法: 节点[可呼叫|名称] [:] 如果是可可的,这将附加到当前节点. 如果它 是一个名字 将成为新的当前节点. 当前节点具有 堵塞 或直到创建新节点. atter name =表达 这将设置 当前节点上表达式的属性名称. 我不认为它与"制造"相同,但我不会统治它 出去.....
# 回答24

格洛姆德写道: 我的代码只是表明该建议不仅用于HTML生成,而且可以在您想创建复杂的层次数据架构时使用. 足以看到为什么没有人想使用的人 这样的语法. 我需要向您展示一个不能使用您显示的样式的示例? 请不要. 让我们保护无辜的眼睛. 对不起,愚蠢. 这不是您的错:-)询问所有从Perl转换为Python的编码人员为什么这样做... 您似乎真的有Perl的东西... 是:可读性. 愚蠢,我需要一个可读的,隐秘的操作员 语. 找到语法隐秘. 隐秘 *和 *完全丑陋的fwiw. 另外,您未能解决这样一个事实,即可能有更好的方法 为此,甚至可能没有语法更改. - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答25

格洛姆德写道: 这是一种轻描淡写. (剪),但我会尝试将其正式化一些. 我建议两个新的关键字"节点"和" attr". 具有语法:节点[Callable | name] [:]的语法,如果它是可召唤的,则将其附加到当前节点. 如果是名称,它将成为新的电流节点. 当前节点具有块的范围或直到创建新节点. attr name =表达式这将在当前节点上设置属性名称为表达式. 我们已经有这个语法(非常接近): 类<名称>(超级): = * [班级 *] 还有zope3" insterments"技巧,可以修改 没有分配的类名称空间: 类<名称>: (*Args,** KW)* 因此,您想要的是,如果没有任何语法更改,那么您的需求肯定是可行的. 我认为它与"制造"相同,但我不会排除它..... 它已经被排除了IIRC. - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答26

>我们已经(非常接近)此语法: 我将如何使用上述语法来做到这一点. 你能给我一个例子吗? 例如,您将如何做: root = et.element(" html") 节点root: attr Head(" head"): 节点标题("标题): 因为我在各节中: 节点部分(): attr text =部分[i]
# 回答27

glomde aécrit: 我将如何使用上述语法来做到这一点. 你能给我一个例子吗? 例如,您将如何做:root = et.element(" html")节点root:attr head(" head"):node title(" title):for in exect:node section():attr text = section = section [ 一世] 您的摘要不遵循您描述的语法. 但是FWIW: 类根(节点): 班级(节点): 类标题(节点): 内容="页面标题" 为了 部分中的部分: 课程(节点): 内容=部分 好的. 得到它. doh :( 无法正常工作,因为我们既不能重复使用相同的名称也不动态 创建它(如果可能的话,我看不到没有真正脏的 代码). 点了. 我们需要make:声明,但是BDFL已发音. 我仍然是-2反对您的主张,但这可能会成为一个很好的用例 为了发表声明. 我关注了新的" with"陈述,但是 我不确定它可以用来解决这个问题.
# 回答28

Am Freitag 19 Mai 2006 02:08 Schrieb Bruno Desthuilliers: 不能. " with"是一个公然的错误称呼,因为它的功能是 (基本上是一个"受保护的"发电机),至少如果您知道在 VB(上帝,我真的在将VB与Python进行比较吗? 在前者...) --- Heiko.
# 回答29

Heiko Wundram aécrit: 哈哈 !-) 而且我什至从未在前者中进行编程...) 我去世了. 相信我,这有点像WTF 语言...引用诗人的话:"愚蠢到一边有点丑陋". 但是我没有考虑与VB的" With with"! - ) 几乎其他(除班级)语句定义了一个块,然后 成为您可以操纵的名称空间. 就像是: 用节点('root')作为root: 以节点("头")为头: 使用节点('title')作为标题: title.content ="页面标题" 对于S部分: 使用节点('pection%s'%s ['title'])作为部分: pection.content = s ['content'] 现在的问题是:如何使节点对象恢复? 如果可能的话 不明确地将它们添加到父对象? (这不会 无论如何,解决根节点的问题).
# 回答30

因此,我读了所有制作PEP的槽,然后将支持语法 我提议.. 在许多方面都更加通用,更好. 由于被拒绝了,我有 继续生活 和我的预处理器... ......允许这种自定义可以允许编写XML 没有重复元素名称,也没有嵌套 对应于XML元素的嵌套: 使元素html: 使元素主体: 文本("先前H1之前") 使元素H1: attrib(style ='first') 文本('第一H1') 尾巴("第一次H1之后") 使元素H1: attrib(style ='second') 文本('第二h1') 尾巴('第二h1之后')
# 回答31

glomde aécrit: .... bug the BDFL,直到他重新吸收其位置为止.
# 回答32

格洛姆德写道: 您可能想查看PEP 359的想法:http://www.python.org/dev/peps/pep-0359/(_@_ _) 伊恩·比奇(Ian Bicking)写道: 您可能想查看PEP 359的想法:http://www.python.org/dev/peps/pep-0359/ 更具体地说 - 这回答了我对 使用语句使用:http://mail.python.org/pipermail/pyt...il/336774.html - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"

标签: python

添加新评论