django.utils.functional中的惰性函数如何调用实际函数以及为什么调试工具无法重现结果?

时间:2016-09-19 02:32:31

标签: python django debugging pycharm lazy-loading

我试图了解lazy()函数在Django模块django.utils.functional中是如何工作的。我不明白的一件事是决定何时调用实际函数。

这是我用来测试懒惰函数的脚本:

from django.utils.functional import lazy


def func1(x, y):
    print("Task is executing ... ")
    return x + y

print("===== Sec 1")

lazy_func1 = lazy(func1)

print("\n===== Sec 2")

x = lazy_func1(3, 99878)
print(type(x))

print("\n===== Sec 3")

print(lazy_func1(3, 1000))

print("=====")

上述脚本的输出是:

===== Sec 1

===== Sec 2
<class 'django.utils.functional.lazy.<locals>.__proxy__'>

===== Sec 3
Task is executing ... 
1003
=====

因此x = lazy_func(3,1000)不会调用预期的函数。但是,print(type(x))不会调用实际函数,print(x)会调用。为什么会这样?

另一个有线的事情是,当我尝试使用调试工具(pycharm debug)来跟踪源代码来检查钩子下发生了什么时,会生成一些完全不同的输出:

Connected to pydev debugger (build 162.1967.10)

===== Sec 1

===== Sec 2
Task is executing ... 
Task is executing ... 
Task is executing ... 
Task is executing ... 
<class 'django.utils.functional.lazy.<locals>.__proxy__'>
Task is executing ... 
Task is executing ... 
Task is executing ... 
Task is executing ... 

===== Sec 3
Task is executing ... 
Task is executing ... 
Task is executing ... 
Task is executing ... 
Task is executing ... 
1003
Task is executing ... 
Task is executing ... 
Task is executing ... 
Task is executing ... 
=====

Process finished with exit code 0

因此,使用调试工具,print(type(x))和print(x)都会调用函数几次。为什么调试工具似乎搞乱了懒惰的功能?这意味着什么?这是否意味着我们不能使用调试工具来调试惰性函数?

0 个答案:

没有答案