允许零维下标

你好, 我发现我需要对Python语法进行一些更改. 我 想听听您对此的看法. 两行: 当前,表达式" x []"是语法错误. 我建议它将像" x [()"一样对其进行评估,就像" x [a,b]"为 现在像" x [(a,b)"一样进行评估. 再说一句话:当前,一个对象可以由几个 元素,被逗号隔开. 它被评估好,好像对象是 由包含这些元素的元组订阅. 我建议一个 对象也将是无元素的订阅,它将 可以评估对象是由空元组订阅的. 它不涉及倒退不兼容,因为我们正在处理 当前非法语法的合法化. 它与当前语法一致. 考虑这些 当前身份: x [i,j,k] <-> x [(i,j,k)] x [i,j] <-> x [(i,j)] x [i,] <-> x [(i,)] x [i] <-> x [(i)] 我建议下一个身份也将保持: x [] <-> x [()] 我需要这个,以便能够参考零维数组 很好. 在numpy中,您可以有不同数量的数组 方面. 为了指代二维数组中的值 你写一个[i,j]. 为了指代一维的值 数组,您写了一个[i]. 您也可以具有零维数组, 具有单个值(标量). 为了提及其价值,您 目前需要编写一个[()],这是出乎意料的 - 用户可能不会 甚至知道,当他写[i,j]时,他会建造一个元组,所以他 不会猜测[()]语法. 如果我的建议被接受,他将 能够编写[]以指定值,如预期. 它会 即使在不更改numpy软件包的情况下工作! 在正常使用numpy时,您通常不会遇到 零维数组. 但是,我正在为另一个图书馆设计 管理多维数据阵列. 它的目的与 电子表格的图表 - 分析数据并保留 计算及其目的地的来源. 在这样的环境中 您可能有很多多维数组 - 例如,销售 在几个时间段的几种产品中. 但是你也可能有一个 很多零维数组,即单个值 - 例如, 所得税. 我希望访问零维数组 与对多维阵列的访问一致. 只是使用 获得其值的零维数组的名称不在 工作 - 必须区分数组及其包含的值. 我试图更改CPYTHON来支持它,这很容易. 您可以在此处看到针对当前SVN的差异:http://python.pastebin.com/768317 测试套件通过预期的是没有变化的情况. 我没有包括 自动化文件的差异. 我几乎对AST一无所知,所以我 如果熟悉AST的人会检查 看看我是否做对了. 它确实是SE 不过,要工作. 好吧,您如何看待这个? 祝你有美好的一天, Noam Raphael

# 回答1

在消息中写道 新闻:11 ***********************@I40G2000CWC.GOOGLEGRO UPS.COM ... 0 0 load_name 0(x) 3 load_name 1(a) 6 load_name 2(b) 9 build_tuple 2 12 binary_subscr 13 return_value Parens周围仅需要进行优先分组, 与(a+b)*c相同. 我建议一个对象也可以订阅,根本没有元素,它将被评估,好像对象是由空元组订阅的. 同样,对此就不会"好像". 你建议 在这种特定情况下,围绕元组的帕伦斯没有什么可选的. 虽然在逻辑上可能是可能的,但Guido认为元组应该 *始终 * 与其他未知区分开,并与周围的代码脱离 括号. 原因是避免歧义并捕获错误. 我认为 总体而言,这是一个不错的选择. Terry Jan Reedy
# 回答2

你好, 特里·里迪(Terry Reedy)写道:这不是"好像". 'a,b' *是 *一个元组,对象 *由元组缩写. 在非空元组周围添加()除了一点噪音之外,什么也没有添加. 这并不一定要重要,但是从技术上讲,它不是"元组". 在" x [1,2]中的" 1,2" 在" x = 1,2"中 - 例如,您可以拥有" x [1,2:3:4,...,5]", 不是在方形牙套外的合法元组 - 实际上,甚至不是 帕伦斯内部法律:" x [(1,2:3:4,...,5)]"不是法律语法. noam
# 回答3

在消息中写道 新闻:11*************************************************************************************************************************. ". 告诉编译器. 在这里再次代码. 是的,切片和省略号的文字仅在括号内直接有效. 绝对值得知道他们,这是一个地方 元组不能被括号. 但是一旦被接受, 切片和椭圆对象是生成元组的成员 其他. dis(compile(" x [1,2:3:4,...,5]",',','eval')) 0 0 load_name 0(x) 3 load_const 0(1) 6 load_const 1(2) 9 load_const 2(3) 12 load_const 3(4) 15 build_slice 3 18 load_const 4(省略号) 21 load_const 5(5) 24 build_tuple 4 27 Binary_subscr 28 return_value 因此,我认为元组子标记是 不是什么. Terry Jan Reedy
# 回答4

你好, 特里·里迪(Terry Reedy)写道: 我知道一个元组是 *构造 *. 问题是,这是 从概念上讲,该功能使您能够强加 在某些情况下,元组. 如果我们将其视为相同的功能,那就是 合理认为"什么都没有"不会被视为一个空的元组,就像" ="不表示" a =()". 但是,如果我们看到这个 S一个不同的功能,允许 通过在幕后构建元组,多维下标, 为X []构建一个空的元组似乎对我来说很合理. 自从 在某些情况下,您根本无法拥有括号,我认为x [] 说得通. noam
# 回答5

sptheptydeyde*@gmail.com写道: 我知道一个元组是 *构造 *. 问题是,从概念上讲,这是使您可以在某些情况下添加元组括号的功能. 如果我们将其视为相同的功能,那么合理地说,"没有什么"不会被视为一个空的元组,就像" a ="不是" a =()". 但是,如果我们将其视为另一个功能,可以通过在幕后构造元组来允许多维下标,那么为X []构建一个空元组对我来说似乎很合理. 由于在某些情况下,您根本无法拥有括号,所以我认为x []是有道理的. 嘿,我有一个主意,为什么我们不看语言参考手册 而不是想象我们认为它可能有效! 在第3.2节中,我们发现: """ 元组 元组的项目是任意的python对象. 两个或两个以上的元组 项目由逗号分隔的表达式列表形成. 一个元组 可以通过将逗号固定到表达式来形成项目(singleton') (表达式本身不会产生元组,因为括号必须 可用于分组表达式). 可以由空元组形成 一对空括号. """ 因此,似乎您的猜测是错误的. 第2.6节 定义" [和"]"为定界符. 第5.3.2节定义了订阅 (我并没有真正爱上一个术语,而是什么,但是 订阅:: = primary" [" expression_list"]" 和第5.12节,定义了expression_list,明确说 """一个包含至少一个逗号的表达列表产生元组.""". 因此,尽管您的更改可能非常方便 允许您将标量值称为零维数组 真的不适合Python的概念框架. 对不起. 另一点:如果您确实确实将标量概念化为 零维数组,该值在概念上存储在哪里? 问候 史蒂夫 - - 史蒂夫·霍顿+44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com 爱我,爱我的博客http://holdenweb.blogspot.com 最近的漫步http://del.icio.us/steve.holden
# 回答6

我的0来自我,但这绝对是一个可振奋的建议. 建议:将您的帖子变成菜单并将其发布在某个地方,发布 补丁跟踪器的补丁,并简要介绍Python-Dev, 看看会发生什么. (如果您希望它进入2.5,您可能必须今天做所有这一切, 尽管...)
# 回答7

在消息中写道 新闻:11 ***********************@f6g2000cwb.googlegrou ps.com ... 重复:元素由逗号定义. 没有一个括号 元组,除空元组外,要省略. 考虑:a+b是总和; 在 (A+B)* c,总和是为了避免与a+b*c的混淆. 喜欢 其他表达式,需要在需要时括号 混乱. 因此(1,2)+(3,4)需要Parens,因为1,2+3,4将是某种东西 不同的. 在这两个示例中,帕伦斯都用于逆转正常优先级 关系. Terry Jan Reedy
# 回答8

史蒂夫·霍顿(Steve Holden)写道: 这样想:一个长度为3的n维的阵列将有 3 ** n总条目. 0维阵列将有多少个条目? 3 ** 0 == 1. 数字已有零维数组已有很长时间了,并且没有 存储它们的问题. 考虑访问一个元素的规则 数组:这是所有索引的基本指针 +总和(指数*步幅). 现在 将其概括为零:没有索引,因此标量为 存储在基本指针上. 卡尔银行
# 回答9

卡尔·班克斯(Carl Banks)写道: 是的,似乎是这样. 您将有一点...如果文档正确. 只是不是. 根据参考手册,expression_list的规则是:expression_list :: = expression("," expression)* [","],但请采用以下法律python订阅阵列:a [1:2,...,...,3 :4] 但是括号内的元素没有表达列表, 这是切片(请参阅第5.3.2节). " 1:2"表达式? 怎么样 "..."? 当我在1:2 1:2是短片. ....是一个省略号. 这些元素都不允许在非拨圈的上下文中. Python提示,我会收到语法错误. 事实是,这里的文档要么是错误或简化的,要么是两者兼而有之. (我认为这没什么大不了的,实际上是:真正的语法有很多复杂性来处理棘手的案例,这些案例将不必要地使人类读者的参考手册复杂化. .3). 您会很高兴知道未使用订阅. :)预告片:'('[arglist]')'| '['sisscriptlist']'| '.' 名称usiscriptList:subscript(','subscript)* [','] sliceop:':'[test]下标:'. '.' '.' | 测试| [test]':'[test] [sliceop] testList:test(','test)* [','] 语法的简化已明确记录: """ 而不是进一步使语法复杂化,而是歧义 定义在这种情况下,解释为订阅 优先于解释为切片(如果 切片列表不包含适当的切片或椭圆形). 同样,当 切片列表完全有一个短片,没有尾随的逗号, 解释为简单的切片,优先于此 扩展切片. """ 显然,用于列表下标的语法规则不同于用于表达式列表的语法规则(由于某种原因,普通人所说的表达式称为语法中称为"测试",而" expr"是非 - 短路表达). 因此,有一种定期创建非空元组的方法,以及一种下标. 而且有一种定期创建空的tupl的方法 E ...但不是下标. 因此,我会说这个变化非常适合元组的概念框架. 实际上,它使下标元素与常规对应物更平行. 尽管这场辩论开始使我听起来像一个 不是语言律师. 但是,我应该指出你是什么 描述为"元组"应该更正确地描述为 " slice-list"一旦将切片或省略号作为元素. 据我所知,在第5.3.3节中描述了切片. 这样想:一个长度为3的n维数的数组将有3 ** n总条目. 0维阵列将有多少个条目? 3 ** 0 == 1.数字长期存在零维数组,并且存储它们没有问题. 想想访问数组元素的规则:这是所有索引的基本指针 +总和(指数*步幅). 现在将其概括为零:没有索引,因此标量存储在基本指针上. 我可以看到这一点,而且似乎并不是不合理的. 幸运的是你 持久性使我确定 *做 * 对我来说不合理:您错误地试图将切片和元素等同起来. 说了所有这些,可能 * * 空的切片在句法上可以接受,所以为什么不写 pep去吗? 但是快速:2.5B1织机的功能冻结... 问候 史蒂夫 - - 史蒂夫·霍顿+44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com 爱我,爱我的博客http://holdenweb.blogspot.com 最近的漫步http://del.icio.us/steve.holden
# 回答10

Sybren Stuvel写道: 当然,这取决于X实施: () (但是真的应该导致一个空的元组吗? 更多的Pythonic?)
# 回答11

你好, Sybren Stuvel写道: 我认为在这种情况下,数学符号与 Python概念. 如果我创建一个带有值5的零维数组,则是这样: 写" a = 8"将具有完全不同的含义 - 创建 新名称,a,指向新的int,8. noam
# 回答12

你好, 弗雷德里克·伦德(Fredrik Lundh)写道: 我认为不会. 首先,x [()]已经有所需的 含义在numpy中. 但是我认为这是对的 - 如果您想到 方括号内的内容是订阅列表,每个列表 维度,转化为呼叫__getItem__或__setitem__ 用代表下标的对象元组,然后是一个空的 元组是您不需要表示的书籍. 当然,一个没有逗号的物品不会造成元素,但我看到 这是特殊情况 - 就像括号一样 逗号被解释为元组,除了带有一项的括号 没有逗号. (顺便说一句,感谢您发布PEP的提示 - 我会尝试这样做 迅速地.) noam
# 回答13

OP 2006-06-08,spthedebyide@gmail.com schreef :这不一定重要,但是从技术上讲,它不是"元组". 是的. " x [1,2]中的" 1,2"未根据与" x = 1,2"相同的规则评估 我很确定是. - 例如,您可以拥有" x [1,2:3:4,...,5]",这不是方形括号外的合法元组 是的,它只是方括号外的非法符号. 您可以通过 i = 1,切片(2,3,4),省略号,5 x [i] - 实际上,帕伦斯内部甚至不合法:" x [(1,2:3:4,...,...,5)]不是法律语法. 但是非法的是符号,而不是价值. - - Antoon Pardon
# 回答14

你好, 遵循弗雷德里克的建议,我写了一本宠儿. 它可用 wiki,在http://wiki.python.org/moin/ementyubscriptlistpep和我 还将其复制到此消息中. 祝你有美好的一天, Noam PEP:XXX 标题:允许无括号的空标列表 版本:$修订$ 最后修饰:$ date $ 作者:noam raphael 状态:草稿 类型:标准曲目 内容类型:text/x-rst 创建:2006年6月9日 python-version:2.5? 史术期:2002年8月30日 抽象的 ======== 此PEP建议允许使用空的下标列表 示例``x []``当前是语法错误. 建议 在这种情况下,将通过一个空元组作为参数将 __getItem__和__setitem__方法. 这与 将带有n个元素的元组传递给这些方法的当前行为 当使用长度n的下标(如果包含逗号)时. 规格 ============= Python语法指定方括号内的尾巴 由逗号隔开的"下标"列表,应为 给出. 如果该列表由一个单个下标组成,而无需尾随 逗号,一个对象(一个省略物,切片或任何其他对象)是 传递给由此产生的__getItem__或__setitem__调用. 如果列表 由许多下标组成,或带有尾随的单个下标 逗号,一个元组传递给由此产生的__getItem__或__setitem__ 致电,每个下标有一个项目. 这是语法的形式定义: :: 预告片:'('[arglist]')'| '['sisscriptlist']'| '.' 姓名 下标:下标(','subscript)* [','] 下标:'.' '.' '.' | 测试| [test]':'[test] [Sliceop] Sliceop:':'[测试] 此PEP建议允许一个空的下标,一无所有 在方括号内. 这将导致一个空元组 到由此产生的__getItem__或__setitem__呼叫. 语法的更改是在第一个中制作"订阅列表" 引用行可选: :: 预告片:'('[arglist]')'| '['[sisscriptList]']'| '.' 姓名 动机 ========== 该建议使您可以参考零维数组 优雅. 在 numpy,您可以拥有具有不同数量尺寸的数组. 在 为了在二维数组中引用一个值,您可以编写 ``a [i,j]''. 为了指代一维数组中的值 你wri te``a [i]`` 您也可以有一个零维数组 拥有一个值(标量). 为了参考其价值,您目前 需要写``a [()````一个意外的 知道当他写``a [i,j]``他建造一个元组时,所以他 不会猜测``[()]``语法. 如果接受了建议, 用户将能够编写``a []``为了将值称为 预期的. 它甚至可以在不更改Numpy软件包的情况下工作! 在正常使用numpy时,您通常不会遇到 零维数组. 但是,这个PEP的作者正在设计 另一个用于管理多维数据阵列的库. 它的 目的类似于电子表格的目的 - 分析数据和 保留计算源及其之间的关系 目的地. 在这样的环境中,您可能有很多 多维阵列 - 例如,几种产品的销售 在几个时间段内. 但是你也可能有几个 零维数组,即单个值 - 例如 所得税率. 希望访问零维 阵列将与对多维的访问一致 数组. 仅使用零维数组的名称获得 它的价值行不通 - 数组及其包含的值 必须区分. 理由 ========= 将一个空的元组传递到__getItem__或__setitem__ call是 之所以选择,是因为它与传递N元素的元组一致 当使用n个元素的下标列表时. 另外,它将成为numpy 和类似的包装按预期的零阵列工作 没有 任何变化. 一致性的另一个提示:目前,这些等价人保持: :: x [i,j,k] <-> x [(i,j,k)] x [i,j] <-> x [(i,j)] x [i,] <-> x [(i,)] x [i] <-> x [(i)] 如果接受此PEP,则将举行另一个等效性: :: x [] <-> x [()] 向后兼容 ===================== 此更改完全向后兼容,因为它仅分配 对以前非法语法的意义. 参考实现 ====================== 作为SF补丁编号可用. 1503556. (以及http://python.pastebin.com/768317) 它通过Python测试套件,但目前尚未提供 其他测试或文档. 版权 ========= 该文档已放置在公共领域.
# 回答15

史蒂夫·霍顿(Steve Holden)写道: 是的,似乎是这样. 您将有一点...如果文档正确. 只是不是. 根据参考手册,expression_list的规则是:expression_list :: = expression("," expression)* [","],但请采用以下法律python订阅阵列:a [1:2,...,...,3 :4]但是,括号内的元素没有表达列表,它是切片(请参见第5.3.2节). 第5.3.2节说表达列表是括号内的 (您自己引用了此规则). 第5.12节说一个表达列表 Conma-Separ的共同点 表达式. 但是1:2和...不是 表达. 我只提出这个文档是 不完全正确,尤其是它扫除了重要的 地毯下的区别(对于这种挑剔的讨论). [SNIP]明确记录了语法的简化: [狙击] 很高兴知道. 尽管这场辩论开始使我听起来像一个,但我确实不是语言律师. 但是,我应该指出的是,一旦将切片或省略号作为元素,您所描述的"元组"应更正确地描述为" slice-list". 据我所知,在第5.3.3节中描述了切片. 不,我不认为我是. 我小心地区分语法 规则和元组. 订阅列表和测试列表是语法规则. 这两个家伙的"评估"都可以创建一个元组. 两个语法 规则与元组完全相同:与 逗号创建一个元组,一个带有逗号的下标列表创建元组. 但是请注意,TestList和订阅列表均无法创建空元组. 您需要一个特殊案例 - 只有没有特殊的特殊情况 对于下标. (正如OP指出的那样,视觉效果是您需要 空元组的括号,但不需要其他任何人 下标.)以这种方式考虑:长度3的n维数阵列将有3 ** n总条目. 0维阵列将有多少个条目? 3 ** 0 == 1.数字长期存在零维数组,并且存储它们没有问题. 想想访问数组元素的规则:这是所有索引的基本指针 +总和(指数*步幅). 现在将其概括为零:没有索引,因此标量存储在基本指针上. 我可以看到这一点,而且似乎并不是不合理的. 幸运的是,您的毅力使我确定了 *确实 *对我来说似乎是不合理的:您错误地试图将切片和元素等同起来. OP可能是; 我不是. 但这足够公平; 每个人 应该清楚幕后发生的事情. 说了所有这些,可能存在 * *一个案例,可以提出一个空的切片在句法上可以接受,所以为什么不写PEP并为此而去呢? 好吧,我只有+0,所以我将其留给OP. 我主要是 关注语言参考如何模糊我的感受 是重要的区别. 卡尔银行
# 回答16

弗雷德里克·伦德(Fredrik Lundh)写道:()(但是,这真的应该导致一个空的元组吗? 您将如何索引二维数组? 有一个2元组. 您将如何索引1D数组? 带1元组. 您将如何索引0-D数组? ... Carl Banks
# 回答17

sptheptydeyde*@gmail.com写道: 听起来不错. 它是否与Olap或Olap或 多维表达语言 (http://msdn2.microsoft.com/en-us/library/ms145506.aspx)? 乔治
# 回答18

卡尔·班克斯(Carl Banks)写道: 阵列尺寸不 T存在于Python层. 你很困惑 自定义类可以提供Python的事物的看法. (当然,没有一个是"不存在"的标准价值)
# 回答19

卡尔·班克斯(Carl Banks)写道: 嗯,挂一分钟. 沿着哪个维度 0维数组的长度为3吗? :-) - - 格雷格
# 回答20

格雷格写道:嗯,挂一分钟. 沿着这个0维数组的哪个维度,它的长度为3? :-)-格雷格 对抗他们中的所有零... ;-) 干杯, -tim
# 回答21

乔治·萨基斯(George Sakkis)写道:听起来很有趣. 它是否与OLAP或多维表达式语言(http://msdn2.microsoft.com/en-us/library/ms145506.aspx)有关? 感谢您的参考! 我什么都不知道. 它会 向他们学习可能很有趣. 从简短看OLAP 在Wikipedia,它可能与OLAP有相似之处. 我认为不会 与Microsoft的语言有关,因为该语言将仅由 python,希望能使您能够轻松地做任何您喜欢的事情 数据. 我向python-dev发布了一条消息,(希望)更好地解释了我的 用于x []. 在这里 - 我认为它也有一个关于它如何的想法 看起来像. 我说的是与电子表格类似的东西,因为它可以节省 数据,计算结果以及产生结果的方法. 但是,它与电子表格不同,因为数据不是 保存在具有数值指数的无限二维阵列中. 相反,数据保存在几个"表"中,每个数据都存储不同 类型的数据. 表可能具有任何所需数量的尺寸, 并由有意义的索引,而不是自然数. 例如,您可能有一个名为sales_data的表. 它将存储 从集合([2003,2004,2005])的几年中的销售数据,用于汽车模型 set(['subaru','toyota','ford'] "特拉维夫','Haifa']). 为了指2004年在海法的福特销售, 您将简单地写:sales_data [2004,'ford','haifa']. 如果桌子 是数据源(即未计算),您将能够设置 通过写作的值:sales_data [2004,'ford','haifa'] = 1500. 表可以计算出表. 例如,您可能有一张表 每年持有该年的总销售额,所得税 减去. 它可以由这样的函数定义: lambda年:总和(sales_data [年,模型,城市)用于模型的模型 城市中的城市) /(1 +收入_tax_rate) 现在,就像在电子表格中一样,保留了功能,因此如果您 更改数据,结果将自动重新计算. 因此,如果 您在数据中发现了一个错误,您将能够编写: sales_data [2004,'ford','haifa'] = 2000 和total_sales [2004]将自动重新计算. 现在,请注意,total_sales表也取决于 收入_tax_rate. 这是一个变量,就像sales_data一样. 与众不同 sales_data,这是一个值. 我们应该能够改变我 T,与 重新计算总计_sales表的所有单元格的结果. 但 我们将如何做? 我们可以写 收入_tax_rate = 0.18 但这将具有完全不同的含义. 使 收入_tax_rate可变的是将其视为0维表. 这很有意义:sales_data取决于3个参数(年,模型, 城市),total_sales取决于1个参数(年)和收入_tax_rate 取决于0个参数. 那是唯一的区别. 所以,想到 这样,我们将简单地写下: 收入_tax_rate [] = 0.18 现在,该系统可以知道所得税率已经改变,并且 重新计算需要什么. 我们还必须更改以前的 功能很小,到: lambda年:总和(sales_data [年,模型,城市)用于模型的模型 城市中的城市) /(1 +收入_tax_rate []) 但这很好 - 只是清楚地表明收入_tax_rate []是一个 可能改变其价值的模型的一部分. 祝你有美好的一天, noam
# 回答22

sptheide@gmail.com写道:听起来很有趣. 它是否与OLAP或多维表达式语言(http://msdn2.microsoft.com/en-us/library/ms145506.aspx)有关? 感谢您的参考! 我什么都不知道. 向他们学习可能会很有趣. 从Wikipedia的OLAP简要介绍,它可能与OLAP有相似之处. 我认为这与微软的语言无关,因为该语言将简单地使用Python,希望使您可以轻松地对数据进行任何操作. 很高兴它有所帮助,我以为您已经熟悉了这些. 至于 MDX,我并不是说您应该使用它代替Python或实施 在语法级别,但是您是否考虑具有相似的API 概念. 鉴于您的描述,我认为您应该一定 看一下MDX的重点(数据附件,尺寸, 层次结构,级别,度量等)和功能,而不是其语法. 这是我在线找到http://support.sas.com/documentation...p_mdx_7002.pdf的不错的手册. 问候, 乔治

标签: python

添加新评论