我得到了不请求许可的基本理念,只是去做并请求宽恕。例如,它不需要是具有 .read() 方法的文件,稍后当您想要读取类似文件的对象时发现“正常工作”的东西时,您会感谢自己。但是,对于像文件这样的复杂对象,这几乎比像数字这样的简单对象更容易理解。
所以我正在尝试编写一个非常简单的类。细节无关紧要,但它有一个内部计数器,并且当计数器超过限制时必须做一些事情。限制在创建对象时作为参数提供。
现在我正在考虑防御性编程。显然我希望我的限制是一个整数,或者至少是一个比较像整数的东西。它可能比这更弱,因为如果它是一个浮点数,我所做的 >= 测试仍然会提供正确的行为。
虽然类用户会知道这个参数应该是一个整数,但如果不是,我希望对象做一些不出所料的事情。我的第一个想法是检查我是否真的有一个号码
if isinstance(limit,(int,long,float)):
但是这里有很多“不要测试,尝试除外”的答案,所以我知道这是不符合标准的。最好使用限制,并等待抛出异常。所以我在里面试了一下:除了各种限制
if counter >= limit:
如果 limit 是 int 或 float,这可以正常工作。然后我限制了一个字符串或一个元组,与数字比较的对象没有任何明显或合理的定义,并等待捕获异常。但它执行,返回一个布尔值,并保持沉默。
所以我是 RTFM,结果是比较不会引发混合类型的异常,这与“容器中的 x”的操作有关,在任意类型上测试相等性。对于不同的类型,它总是返回 not_equal,但是幅度比较虽然一致,但是是任意的。如果混合类型幅度比较总是返回 False,我也许可以使用它,但它也会很高兴返回 True。
如果我尝试在非数字上使用其他类似整数的行为,我会得到预期的异常,例如这个字符串 + 数字会引发 TypeError
limit+0
所以我可以说
if counter >= (limit+0)
如果 limit 不是数字,则会引发所需的异常。但这感觉几乎是模糊的。我正在对表达式做一些额外的事情,以便在后门进行类型测试。任何代码优化器或其他编辑器都会删除明显冗余的算术运算。这就像看物体是否与鸭子一样重,看它是否由木头制成,因此可以像女巫一样被烧毁(有点)。
一个更明确的可能性是
if counter >= int(limit)
至少有一些内置的解释。它并没有完全按照我在所有情况下想要发生的事情发生,但它目前已经足够了,它不会让任何人感到惊讶。
那么WWGD?当你想要做的只是比较它的大小时,安全地使用不受信任的参数的pythonic方法是什么?