一文踩遍Python中的坑

下面的代码会报错,为什么?

这个问题是变量作用域问题,在gen=(x for _ in xrange(10))中gen是一个generator,在generator中变量有自己的一套作用域,与其余作用域空间相互隔离。因此,将会出现NameError: name ‘x’ is not defined的问题,那么解决方案是什么呢?答案是:用lambda 。

我想写一个类装饰器用来度量函数/方法运行时间

但是运行在方法上会报错,为什么?

如果我坚持使用类装饰器,应该如何修改?

使用类装饰器后,在调用 func 函数的过程中其对应的 instance 并不会传递给 call 方法,造成其 mehtod unbound ,那么解决方法是什么呢?
我们知道 call 方法可以用来重载圆括号调用,好的,以为问题就这么简单?Naive!

现在我们可以看到a()似乎等价于a.call(),看起来很 Easy 对吧,好的,我现在想作死,又写出了如下的代码,

为什么a()没有调用出a.call()?

原因在于,在 Python 中,新式类( new class )的内建特殊方法,和实例的属性字典是相互隔离的,具体可以看看 Python 官方文档对于这一情况的说明

For new-style classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary. That behaviour is the reason why the following code raises an exception (unlike the equivalent example with old-style classes):

同时官方也给出了一个例子:

回到我们的例子上来,当我们在执行 a.call=lambda:“invoking call from lambda” 时,的确在我们在 a.dict 中新增加了一个 key 为 call 的 item,但是当我们执行 a() 时,因为涉及特殊方法的调用,因此我们的调用过程不会从 a.dict 中寻找属性,而是从 type(a).dict 中寻找属性。因此,就会出现如上所述的情况。

最后:【可能给予你帮助】

一文踩遍Python中的坑_第1张图片

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你

关注我的微信公众号【软件测试小dao】免费获取~

我的学习交流群:1033482984 群里有技术大牛一起交流分享~

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

你可能感兴趣的:(软件测试,测试工程师,python,测试,测试工程师,软件测试,白箱测试,单元测试)