我不确定我是否喜欢 Python 的动态特性。它经常导致我忘记检查类型,试图调用属性并获取 NoneType(或任何其他)没有属性 x 错误。其中很多都是无害的,但如果处理不当,它们可能会导致整个应用程序/进程/等瘫痪。
随着时间的推移,我可以更好地预测这些可能会出现的位置并添加显式类型检查,但因为我只是一个人,所以我偶尔会错过一个,然后一些最终用户会找到它。
所以我对您避免这些问题的策略很感兴趣。你使用类型检查装饰器吗?也许是特殊的对象包装器?
请分享...
最佳答案
forgetting to check a type
这没有多大意义。你很少需要“检查”一个类型。您只需运行单元测试,如果您提供了错误的类型对象,事情就会失败。根据我的经验,您永远不需要“检查”太多。
trying to call an attribute and getting the NoneType (or any other) has no attribute x error.
Unexpected None 是一个很老的错误。 80% 的时候,我省略了 return。单元测试总是揭示这些。
在剩下的那些中,80% 的时间,它们是由于“提前退出”而导致的普通旧错误,它返回 None 因为有人写了一个不完整的 return陈述。这些 if foo: return 结构很容易用单元测试来检测。在某些情况下,它们应该是 if foo: return somethingMeaningful,而在其他情况下,它们应该是 if foo: raise Exception("Foo")。
其余的都是误读 API 的愚蠢错误。通常,增变函数不返回任何东西。有时我会忘记。单元测试很快就能找到这些,因为基本上没有什么是正确的。
这涵盖了“意外的 None”情况。易于单元测试。大多数错误涉及针对一些非常明显的错误类型的相当简单的编写测试:错误的返回;未能引发异常。
其他“没有属性 X”的错误是使用完全错误类型的严重错误。那要么是真正错误的赋值语句,要么是真正错误的函数(或方法)调用。他们总是在单元测试期间精心设计失败,需要很少的努力来修复。
A lot of them are pretty harmless but if not handled correctly they can bring down your entire app/process/etc.
嗯……无害?如果这是一个错误,我祈祷它能尽快关闭我的整个应用程序,以便我能找到它。一个不会使我的应用程序崩溃的错误是可以想象的最可怕的情况。我不会用“无害”这个词来形容无法使我的应用程序崩溃的错误。
关于python - 在 Python 中避免动态类型错误的策略是什么(NoneType 没有属性 x)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2503444/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(