PEP新断言习语

对不起,如果它是重复的. 我的电子邮件程序要么混乱 事物或Python列表将我的味精发送到 /dev /null. 我找不到 以前PEP中有关的任何内容,所以这里是很早的草稿 对于新的"断言"语法: 这是由Ruby的主张语法启发的. 我不熟悉Ruby 一切,所以很有可能这件代码被打破了,但我认为 这个想法很明显. 在Ruby中,断言只是一种获取的方法 一个块参数: 这将始终在新实施中引发一个例外 反对当前例外行为 只有"语句"为false,返回一个空错误消息. 我不 查看这种代码模式的任何用途,并且任何人都非常不可能 曾经实施过它,所以我想没有人会介意打破这一点. 如果我从 社区,但我以前从未写过Pep,而(最糟糕的问题)我 英语不是很好. 有人帮忙吗? 谢谢, 法比奥

# 回答1

FábioMendes写道: ... 为什么这不相同? 除了您保留在这里和 在其他地方,使用您希望表示"表达"的"语句" - 您不能断言陈述,只能主张表达式. 我认为您的意思是打电话,因为如果您不这样做,那肯定会 正确,断言永远不会触发. 现在,称表达表达方式,而不是很困惑 陈述,您能解释一下这种语义是如何的 称为,将与 断言EXP1和EXP2和EXP3 ...以及expn," errormsg" ??? 再次:您能解释一下这一语义与 那些: 断言EXP1和EXP2和EXP3 ...以及expn," errormsg" ??? 或者,如果用户更喜欢,传统的逗号规则也适用: Python中没有这样的"传统"规则(或规则). 两者 陈述和表达在逗号中完全可以很好地结束; 逗号 并不意味着任何延续. Alex
# 回答2

"FábioMendes" 在消息中写道 新闻:Ma ************************************************************************************************************************** on.org ... 你有用例吗? 也就是说,你能举一个合理的例子 显示为什么您的建议将有用以及如何工作?
# 回答3

"FábioMendes" 在消息中写道 新闻:Ma ************************************************************************************************************************** on.org ... 我看到了两个困难. 首先,您可以用一个 尝试围绕一系列陈述和 除块中的断言. 这意味着你 将需要一个基于相当强的用例 方便将语法添加到语言中. 您将必须证明它将被大量使用. 其次,声明表有可能 导致副作用. 有一个非常强大的 思想社区说那是断言的 是调试或验证声明 不应导致任何行为改变 去除 他们. 这可以通过 使其具有某种形式的块 自己的本地变量被丢弃 出口. 约翰·罗斯
# 回答4

>> >>>> ermomsg ='errormsg'为什么这不相等? 除了您在这里和其他地方保留的事实,使用您希望表示"表达"的"语句" - 您不能断言语句,您只能主张一个表达式. 只有概念上有微妙的差异 主张整个表达式,您断言每个表达式 表达. 他们可能是一样的,也许他们会 等效于所有情况,但我不能替代事实或虚假性 陈述. Pythonic对应物涉及太多的打字,并且更多 容易出错. 现在,称为表达式而不是非常混乱的陈述,您能否解释以foo的语义与servert exp1和exp2和exp3和exp3和expn," errormsg"的语义有何不同 这与我的建议非常相似,唯一的不一致性 类型更丑陋: 断言\ EXP1和\ exp2和\ ... expn, " errormsg' 代替: 断言\ exp1, exp2, ... expn, " errormsg' 好吧,我意识到我没有很清楚地表达我的想法 这确实是Python语法的很小的变化. 它不会让任何人 做任何新的事情,ifaik,但它使代码的常见模式有点 更美丽,(为什么不呢?更富有表现力). 如果有人考虑事实 它不会破坏旧的代码(仅在一种不太可能的情况下)我不会 将其视为一个完全不合理的建议. 其他人可能会认为 虽然不同. 谢谢, 法比奥
# 回答5

>我看到了两个困难. 我的意思是表达而不是陈述,对不起,这是我的错. 它是 我应该说的较小的化妆品变化,只是避免长期分组 用"和"操作员表达. 最好表达为:让 逗号代替"和"主张验证...也许 可以扩展到语言的其他部分,但我唯一的地方 认为这将是有用的,这在断言声明中. 谢谢, 法比奥
# 回答6

[FábioMendes] Guido接受该建议的几率大约为零. 正如你所说的 没有做任何新的事情,但确实需要更改语法. 除了, Toowtdi. 同样,吉多往往不会被关于"太多键入"的争论说服. 这是双重的,您是在谈论用逗号替换"和"(大) 哇). 另外,现有的替代方案之一是非常可读的: err ='errormsg' 断言EXP1,err 断言Exp2,err 断言EXP3,err 替代方案的优势是,失败将指出确切的 表达失败. 缺点是重复错误 信息; 但是,我不同意您的用例很常见. 相反,是 每个表达式具有不同的错误消息可能更有利. 例如,以下内容来自QR矩阵中的后条件检查 d eComposition: essert q.tr().mmul(q)==眼(min(m,n))," q不是正顺序" 断言Isinstance(R,Uppertri)," R是上三角形" 断言r.size ==(m,n)," r不匹配原始维度" 断言q.mmul(r)== self," q*r不复制原始矩阵" 一个人可以通过"和"或拟议的逗号链接所有这些,但是您 最终带有一条信息不足的错误消息," QR分解 轰炸了,但我不会告诉你为什么;-)". Raymond Hettinger
# 回答7

一段时间以前,我发现自己提出了一个新的"验证"陈述, 除了: 1)它会抛出验证词而不是断言 如果状况失败 2)优化编译器不会将其变成NO-OP. 目的是对用户数据的运行时验证,而不是理智 检查程序逻辑. 示例:我一直在发现自己写作 代码类似: x = float(raw_input('输入正数:')) 断言x> 0,'数字不是积极的' 这是不正确的,因为不能保证声明 执行. 我建议说, 验证x> 0,'数字不积极' 这会做正确的事. 当我发布之前,该提议得到了相当好的收到的好评 但是我不记得是否有任何结论,也没有 跟进. 由于我们再次谈论Pep的主张 陈述,我应该尝试将其放在一起吗? (哈)空闲时间?
# 回答8

>一段时间以前,我发现自己提出了一个新的"验证"陈述, [...] 这听起来很棒. 我喜欢验证语法. 这听起来也很 对我有用. 如果不主流,它应该至少是 在运行时控制参数: 该程序正常执行,然后,如果发生无致命错误, ReTaCviolation.Report()将打印出什么是什么 被违反,类似于Unitest模块的作用. 这不是纯dbc i 猜猜,但是很好. 谢谢, 法比奥
# 回答9

>替代方案的优势是,失败将指向确切的 你在这里有一个很好的观点. 也许我提出的只是分心. 我们不希望为每次坐下来量身定制语法,因为它将服务 仅用于展示选定的节目,以表达完整的优雅 语言,但对程序员而言,它产生了记忆的负担 使语言表现力的100个运算符. 的 当然,每个人都会发展个人方言,这将使他 在特定领域中非常表达的代码,但他会与 没有人...因为我们有perl. 所以我想我没有这个线程,但是 有人指出了仍然存在的"验证"陈述的鼓舞人心. 在 至少它将有助于阐明某种混乱的含义 断言声明. (您不应该在运行时使用它? 优化禁用它?). 法比奥
# 回答10

"保罗·鲁宾" 新闻:7x ************@ruckus.bro uhaha.com ... 为什么需要对此表示陈述? imo,一个普通的函数将有能力解决: def validate(表达式,msg = none): 如果表达:返回 如果味精没有: 提高验证 别的 提高验证Error(MSG) Raymond Hettinger
# 回答11

" Raymond Hettinger" 写道: 我有时会写这样的功能,但是使用语句是更多 自然. 例如,这就是为什么存在断言陈述的原因. 由于这种自然,滥用断言的诱惑 陈述非常好,我发现自己一直在做 以为我稍后会清理. 所以我认为有声明 运行时检查将是正确的精神.
# 回答12

FábioMendes写道: ...这与我提出的内容非常相似,唯一的不一致性更丑陋:servert \ exp1 and \ exp2 and \ expn和\ ... expn,'errormsg'而不是:assert \ exp1,exp2,. .. expn," errormsg' 因此,请按照Pep 8的建议: 断言( exp1和 exp2和 ... expn )," errormsg" 我看不到括号(阐明了您的语法问题 在您的第一篇文章中提到)和"和"比逗号更丑. 并且有逗号的平均线延续是不可能的. Alex
# 回答13

在阳光下,2004年11月7日03:50:43 GMT," Raymond Hettinger" 写道:吉多接受此建议的几率大约为零. 正如您所说,Itdoes没有做任何新的事情,但确实需要更改语法. 此外,toowtdi.loso,Guido倾向于不会被"太多打字"的争论来说服.这是双重的是您在谈论用逗号替换"和"逗号(bigwhoop).也是现有的选择之一. 非常可读性:err ='errormsg'Assert exp1,errassert exp2,errassert exp3,errthe替代方案的优势是,故障将指向失败的精确表达. 缺点是重复错误; 但是,我不同意您的用例很常见. 取而代之的是,对于每个表达式有不同的错误消息,更有优势. )," q不是正顺序"的断言(r,uppertri)," r是上三角形" sabtert r.size ==(m,n)," r不匹配原始维度" surstert q.mmul (r)== self," q*r不重现原始矩阵",一个人可以通过"和"或拟议的逗号链接所有这些,但随后用一个,不太有用的错误消息, QR分解炸弹,但我不会告诉你为什么;-)". 此外,如果您想要带有逗号的表达式的单个消息, 您已经可以写: 我没有捷径,所以您可以在准备ARG列表的例外 类似的序列 断言( den!= 0,'denom必须为零', num/den> 5,'最好将其写成essert num> 5*den' ) 这会更安全 assert den!= 0,'denom必须是zer O' 断言num/den> 5'最好将其写成servert num> 5*den' 更不用说副作用了,但是无论如何您都不应该有那些主张. 愚蠢;-) 问候, Bengt Richter
# 回答14

EmSâb,2004-11-06âs 22:48 -0800,保罗·鲁宾·埃斯·雷夫(Paul Rubin Escreveu):我有时确实写下这样的功能,但是使用陈述更自然. 例如,这就是为什么存在断言陈述的原因. 由于这种自然性,滥用断言陈述的诱惑非常好,我发现自己一直在这样做,以为我稍后会清理它. 因此,我认为对运行时检查的声明将是正确的精神. 如果不是这样,我们应该在组装中编程,因为它更快:) AFAIK所有现实世界的编程语言都等同于Turing,所以 糖是对方的区分. 我很想看到那糖 在Python中,由于定义断言功能是分散注意力的. 法比奥
# 回答15

>因此,请按照PEP 8的建议: 我从未说过逗号应该意味着线延续(作为后斜线). 它可以用作隐式线的连续性,例如 例如,函数参数. 这只是另一种情况. 干杯, 法比奥
# 回答16

感谢您的澄清:-) 法比奥 EM DOM,2004-11-07 S 07:43 +0000,Bengt Richter Escreveu:Guido接受此提案的几率大约为零. 正如您所说,Itdoes没有做任何新的事情,但确实需要更改语法. 此外,toowtdi.loso,Guido倾向于不会被"太多打字"的争论来说服.这是双重的是您在谈论用逗号替换"和"逗号(bigwhoop).也是现有的选择之一. 非常可读性:err ='errormsg'Assert exp1,errassert exp2,errassert exp3,errthe替代方案的优势是,故障将指向失败的精确表达. 缺点是重复错误; 但是,我不同意您的用例很常见. 取而代之的是,对于每个表达式有不同的错误消息,更有优势. )," q不是正顺序"的断言(r,uppertri)," r是上三角形" sabtert r.size ==(m,n)," r不匹配原始维度" surstert q.mmul (r)== self," q*r不重现原始矩阵",一个人可以通过"和"或拟议的逗号链接所有这些,但随后用一个,不太有用的错误消息, QR分解炸弹,但我不会告诉你为什么;-)". 此外,如果您想要带有逗号删除表达式的单个消息,您已经可以写下:我不捷径,因此您可以在准备诸如sosters之类的序列的arg列表时得到一个例外(den!= 0,'denom必须 零',num/den> 5,'最好将其写成servert num> 5*den'),它会更安全,因为sostert den!= 0,'denom必须为零'servert num/den> 5'最好写它 正如断言num> 5*den'更不用说副作用了,但是无论如何您都不应该有那些主张. 愚蠢的;-) fâbioMendes uol.com.br>写道: 我不确定我是否正确理解您,但是如果您说的是 函数参数列表中的逗号表示隐式线的延续,i 认为这可能不正确. 指示未闭合的括号 线的延续,而不是逗号 - 这就是为什么您可以编写函数的原因 跨多行的参数列表,但这也是为什么您可以编写元组的原因 跨线: 1 2 3 史蒂夫
# 回答17

FábioMendes写道:我不知道这适用于'和/或'运营商(即使我已经阅读了样式指南PEP!),对不起, . 这不是超级美丽,但我可以对此感到满意:) 它适用于括号 - 哪些操作员在内部 括号,根本不包括,无关紧要. 逻辑线 直到所有类型的括号都保持平衡之前. 我从未说过逗号应该意味着线延续(作为后斜线). 在批处理情况下,它可以用作隐式线的连续性(例如函数参数.这只是一种情况. 不,逗号永远不能用作python的隐式线延续 (这与其他一些语言不同). 开放的 未封闭的括号是导致几条物理线成为的一部分 相同的逻辑线 - 不是逗号,也不是其他操作员或标点符号. 例如,请考虑: 打印("一些文字" '还有更多' '又更多') 看马萨诸塞州:没有逗号(也没有其他标点符号或操作员,但三个 物理线仅合并为一条逻辑线 - 多亏了 括号. 这将打印 有些文字和一些狂热的人 因为相邻的字符串文字合并为一个字符串(在 python就像在c中一样). 如果您用括号放置逗号,您将打印出一个 元组. 使用逗号,没有括号,语法错误. 您可能正在将"逗号继续行"与"函数参数"相关联 因为功能定义和呼叫确实使用括号,并分开 逗号的争论. 但这确实不是理想的心理模型. Alex
# 回答18

保罗·鲁宾(Paul Rubin)写道: 我认为"断言"是吉多的遗憾清单上的声明. 执行和 印刷在他的后悔清单上:两者都应该是一个功能. 我 尽管我不确定,但认为断言也是如此. 陈述非常好,我发现自己一直在想我以后会清理. 因此,我认为对运行时检查的声明将是正确的精神. 我认为,断言几乎没有用. 有时可能对 调试目的,但除此之外,不是. 例外提出了 "断言"总是断言. 那是一个主要的劣势,因为 这不是具体的. 如果我称呼的方法会提出一个断言 有些情况,我想 抓住它,我抓到太多了. 创建一个 因此,新的例外级,并因此而提高了一个更好的选择. 我看不出像 "断言Isinstance(消息,插曲)". 到目前为止是最常见的 使用断言:关于参数类型的一些断言. 这是 充其量是多余的. 在警告的情况下,接下来是 re.compile(消息,...). 在此示例中删除断言会导致 在三个区别中: - 提出的错误将是TypeError,而不是断言. 所以 它更具体,因此更容易捕获. - 我会通过RE模块提出的错误,而不是警告模块 - 错误将是"第一个参数必须是字符串或编译 模式"而不是"消息必须是字符串".因此, 断言使不可能通过编译的图案 字符串. 鸭子打字消除了断言的使用. 我认为,应该弃用断言,然后在py3k中删除: 断言是多余的,非特异的,并且与哲学冲突 鸭打字和EAFP. 别人对此有何看法? Gerrit. - - 荷兰的Techthe的天气07/11 13:25: 12.0°C风3.6 m/s N(NAP高57 m) - - 在政府委员会中,我们必须防止收购 不必要的影响,无论是寻求还是无寻求的影响 军事工业综合体. 灾难性崛起的潜力 存在放错的权力并将持续存在. -Dwight David Eisenhower,1961年1月17日
# 回答19

你好, 当我得到你在说什么时 - 我想你是 缺少断言函数的点. 如果您记录了断言 (您应该这样做)您是在说: - 如果您给我一些东西 遵循这些规则,然后我会这样做 - 谢谢. 在Java和Eiffel中,您可以选择编译代码 无主张检查 - 给您一个紧张的调试阶段和 宽松,更快的运行时间情况(只要您的代码经过测试 和健壮). 但是埃菲尔的要求并确保断言 关于类固醇的陈述! 关于此的经典文字是Bertrand Meyer的发明者 埃菲尔. 虽然埃菲尔的哲学与python的哲学有很大不同 这是一个经典文字. 这是有关它的简短文章的链接:http://archive.eiffel.com/doc/manual...logy/contract/ 干杯, 尼尔 2004年11月7日在阳光下,14:02:09 +0100,gerrit 写道:我有时会写这样的功能,但是使用语句更自然. 例如,这就是为什么存在断言陈述的原因. 我认为"断言"是吉多的遗憾清单上的声明. 执行和印刷在他的遗憾列表中:两者都应该是一个功能. 我认为尽管我不确定,但也有同样的主张. 我认为,断言几乎没有用. 有时它对于调试目的可能是有用的,但是除此之外,不是. "断言"提出的例外始终是断言. 这是一个主要的缺点,因为它不是具体的. 如果我称呼的方法会引起ASSE rtionerror是某些情况,我想抓住它,我抓到太多了. 创建一个新的例外级,并因此而提出一个更好的级别. 我看不到诸如" assert isInstance(消息,asestring)"之类的语句的使用. 到目前为止,这是断言的最常见用途:关于参数类型的一些断言. 这充其量是多余的. 对于警告.Py,其次是re.compile(消息,...). 在此示例中删除断言将导致三个差异: - 提出的错误是TypeError,而不是断言. 因此,它更具体,因此更容易捕获. - RE模块会提出的错误,而不是警告模块 - 错误将是"第一个参数必须是字符串或编译模式",而不是"消息必须是字符串". 因此,断言使得不可能通过编译模式而不是字符串. 鸭子打字消除了断言的使用. 在我看来,应该弃用断言,然后在PY3K中删除:断言是多余的,不明显的,并且与鸭子打字和EAFP的哲学发生冲突. 别人对此有何看法? Gerrit. - 荷兰Techthe的天气07/11 13:25:12.0°C风3.6 m/s N(NAP高57 m) - 在政府委员会中,我们必须防止收购不必要的影响力,无论是寻求或 军事工业综合体无需. 存在放错位置的灾难性崛起的潜力存在并将持续存在. -Dwight David Eisenhower,1961年1月17日-http://mail.python.org/mailman/listinfo/python-list(_@_ _) "FábioMendes" 在消息中写道 新闻:Ma ************************************************************************************************************************** on.org ... 我懂了. 但是,这可能会有句法困难,因为 逗号已经用作元组构造函数. 约翰·罗斯(John Roth)谢谢,法比奥
# 回答20

" gerrit" 在消息中写道 新闻:Ma *********************************************************************我 有时会写下这样的功能,但是使用陈述更自然. 例如,这就是为什么存在断言陈述的原因. 我认为"断言"是吉多的遗憾清单上的声明. 执行和印刷在他的遗憾列表中:两者都应该是一个功能. 我认为尽管我不确定,但也有同样的主张. 我认为,断言几乎没有用. 有时它对于调试目的可能是有用的,但是除此之外,不是. "断言"提出的例外始终是断言. 这是一个主要的缺点,因为它不是具体的. 如果我打电话给一种方法会提出断言,我想抓住它,我会抓到太多. 创建一个新的例外级,并因此而提出一个更好的级别. 我认为断言是一个不变的陈述:每次 我来这里 *必须 *是真的. 我不认为这是陈述 一厢情愿:当我来到这里时,这应该是真实的或 我会遇到问题. 对我来说,一个安排 失败是呼叫者中的编程错误, 没有主张的方法! 试图抓住一个 断言是对陈述提供的滥用. 除此之外,您总是可以打扮 用可以打印的字符串,然后进一步 将变量贴在该字符串中,并带有%. 约翰·罗斯
# 回答21

"约翰·罗斯" 写道: 那里有一个略有非序列. 每个大型系统都包含 编程错误和断言语句是检测到的好方法 错误. 如果断言失败并且没有被捕获,则系统会崩溃. 碰撞运行系统时丝毫编程 错误并不总是可以接受的. 有时你必须 记录错误并尝试从中恢复,禁用该功能 发生了错误,直到有人可以弄清楚出了什么问题,或者 任何; 但不会崩溃. 因此,您需要能够掌握 失败.
# 回答22

Em Dom,2004-11-07 − S 08:56 +0000,Steven Bethard Escreveu:我不确定我是否正确理解您,但是如果您说函数参数中的逗号列表中的逗号表示隐式线 继续,我认为这可能不正确. 这是未闭合的括号指示线的延续,而不是逗号 - 这就是为什么您可以跨多行编写函数参数列表的原因,但这也是为什么您可以跨线编写元组的原因: 现在对我来说很有意义...我认为逗号对线路的负责是负责任,因为这是我们通常如何将函数参数和列表/元组/词典项目分开的方式. 我从没想过这会起作用: .... '酒吧', .... '酒吧': ....'foo'} 但是它确实有效;) 我认为我的鼓动变得越来越荒谬……我放弃了! 感谢您的建议, 法比奥
# 回答23

[...] 你是对的,这是一个微妙的误解,不给语法 错误,所以我从来没有意识到是这样;-)我写了多行 这样的词典: .... 核心价值 .... key2:value2} 后斜线是完全不必要的(丑陋的!). 感谢 澄清, -fabio
# 回答24

"保罗·鲁宾" 新闻:7x ************@ruckus.brouhaha.com ...是的,这是断言声明的目的. 但是,将其用于某些不同的目的,即检查数据有效性有很大的诱惑. 如果有一个非常诱人的诱惑来滥用某些功能在真正打算使用X时进行X,这是该迹象表明是时候添加一个同样方便的功能来进行X.在那里有一个稍微的非序列. 每个大型系统都包含编程错误,并且断言语句是检测错误的好方法. 如果断言失败并且没有被捕获,则系统会崩溃. 在检测丝毫编程错误时崩溃运行系统并不总是可以接受的. 有时您必须记录错误并尝试从中恢复,DISA 在发生错误的功能之前,直到有人可以弄清楚出了什么问题,或者什么; 但不会崩溃. 因此,您需要能够抓住失败. 我想我说的不够好. 当然你抓住了 断言错误,但您将它们分类与不可恢复的相同 环境错误:您擦洗了任何工作单位 处理,记录错误并尝试恢复应用程序,以便 用户可以继续. 我认为我们同意您不想做的事情 尝试从特定的断言错误中捕获并恢复. 约翰·罗斯
# 回答25

gerrit 在消息新闻中写道: ...我认为"断言"是Guido的遗憾列表. 执行和印刷在他的遗憾列表中:两者都应该是一个功能. 我认为尽管我不确定,但也有同样的主张. 我不记得在该列表上看到断言. 与打印和执行不同, 函数不能做什么. 我认为,断言几乎没有用. 有时它对于调试目的可能是有用的,但是除此之外,不是. "断言"提出的例外始终是断言. 这是一个主要的缺点,因为它不是具体的. 实际上,如果您正确使用断言. 我要去的. 如果我打电话给一种方法会提出断言,我想抓住它,我会抓到太多. 创建一个新的例外级,并因此而提出一个更好的级别. 如果您正确使用断言,则您要么不想抓住 断言,或者您想以相当高的水平捕捉它 打印有关程序中的错误的消息. 我看不到诸如" assert isInstance(消息,asestring)"之类的语句的使用. [狙击] 一般而言,这是对断言的错误用法. 我不 赞成这种主张的使用. 断言的正确使用是声明某种条件是 不可能的. 也就是说,如果该程序无漏洞,则此条件将 永远不会发生. 除非 程序中有一个错误. 这是一个荒谬的,不正确的,但说明性的例子 正确使用: def f(y): x = y*y 断言x> = 0 如我们所知,将一个实际数字本身繁殖总是产生一个 正数(为了论证,让我们忽略这样一个事实 y可能是一个复杂的数字). 因此,X不可能成为 消极的. 不可能,也就是说,除非有错误. 断言 声明声明这是不可能的条件. 如果这 条件无法保持,这不是不良的输入. 这是一个错误. 显然,这是一个愚蠢的例子,但是现实世界的例子并非如此 愚蠢的. 因为这是"不可能"的条件,所以只需要检查 调试构建. 这是断言陈述的魔力 进来:在优化的构建中,未检查断言. 因此 这是一种优化. 如果您将断言变成函数,则可以 不再优化屁股 ertion离开,因为函数参数 总是评估. 但是,这提出了一个问题:它是过早的优化吗? 我 会说是,否. 对于简单的断言,例如断言x> = 0, 优化为时过早,可能不值得证明断言 陈述. 但是,我仍然喜欢拥有它,只是记录 被检查的条件是不可能的,因为 反对不良输入或操作系统错误. 但是,有些不可能的条件根本不是 任何人的定义过早优化. 让我告诉你一个 例子: def some_public_function(tree1,tree2): 断言一对一(Tree1,Tree2) ... 在这种情况下,我有两个树的继承制,该程序要保留 1:1始终(即,对于Tree1中的每个节点,都有一个 Tree2中的对应节点). 有数百个功能 在两棵树上运行,所有这些都必须确保更新 两个层次结构. 如果有公共功能的出口点 这些树不是一对一的地方,那是一个错误. 问题是,每次打电话一次检查整个层次结构 公共功能对于生产代码来说太昂贵了. 一个 断言声明使您可以优化此呼叫,并且非常 方便. 我认为权力证明了断言的存在. 断言陈述在我的较大项目中发现了许多许多错误,所以 看到他们走开,我会很伤心. 但是,最后,我可以 轻松地没有它. 简单的断言不花很多钱要入住 生产代码. 我通常会发挥作用的昂贵断言 无论如何,我可以通过不称呼它来优化它,除非 设置了调试标志. 在我看来,应该弃用断言,然后在PY3K中删除:断言是多余的,不明显的,并且与鸭子打字和EAFP的哲学发生冲突. 别人对此有何看法? 我不想看到它消失了,因为它具有有效的用途. 我认为劝阻使用断言的目的是明智的 它不是打算的,例如您给出的示例. IMO,最好的方法是默认情况下断言. 现在设置Python的方式是具有默认模式并优化 模式,优化模式不运行断言. 我会改变的. 我 建议python应该具有默认模式和调试模式 模式,该断言只能在调试模式下检查. 普通的python运行,没有-g标志,只会忽略断言 语句. - - 卡尔银行
# 回答26

[FábioMendes] 哈哈. PEP是一样的. 正是作者的世界观改变了;-) 雷蒙德

标签: python

添加新评论