0

我得到了不请求许可的基本理念,只是去做并请求宽恕。例如,它不需要是具有 .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方法是什么?

4

1 回答 1

0

如果您确实想验证参数是否属于合适的数字类型,请测试它是否是适当的数字抽象基类的实例,也许:

    import numbers
    ...
    if not isinstance(limit, numbers.Real):
        ... # react to the bad argument type

大概在这种情况下,您会抛出TypeError异常。

在您的类的__init__方法中执行此操作,以便尽可能接近调用者的原始错误来检测和报告问题。这比等待一些不确定的时间并最终在程序开始使用计数器时崩溃要好得多,此时异常回溯对于确定问题的根源将没有多大帮助。

如果您感到偏执,您还可以在构造函数中检查此参数的值是否大于零,ValueError如果不是,则抛出异常。

于 2012-06-26T02:12:55.857 回答