我下载了以下代码:
from __future__ import print_function
from time import sleep
def callback_a(i, result):
print("Items processed: {}. Running result: {}.".format(i, result))
def square(i):
return i * i
def processor(process, times, report_interval, callback):
print("Entered processor(): times = {}, report_interval = {}, callback = {}".format(
times, report_interval, callback.func_name))
# Can also use callback.__name__ instead of callback.func_name in line above.
result = 0
print("Processing data ...")
for i in range(1, times + 1):
result += process(i)
sleep(1)
if i % report_interval == 0:
# This is the call to the callback function
# that was passed to this function.
callback(i, result)
processor(square, 20, 5, callback_a)
在python 2下工作正常,但是在python3下出现以下错误:
Traceback (most recent call last):
File "test/python/cb_demo.py", line 33, in <module>
processor(square, 20, 5, callback_a)
File "test/python/cb_demo.py", line 21, in processor
times, report_interval, callback.func_name))
AttributeError: 'function' object has no attribute 'func_name'
我需要在python3下工作。
在Python 3中,这种行为是可以预期的,因为它是从Python 2中更改的。根据此处的文档:
https://docs.python.org/3/whatsnew/3.0.html#operators-and-special-methods
已将名为func_X的函数属性重命名为使用该
__X__
表单,从而在函数属性名称空间中为用户定义的属性释放了这些名称。要机智,func_closure,func_code,func_defaults,func_dict,func_doc,func_globals,FUNC_NAME已更名为__closure__
,__code__
,__defaults__
,__dict__
,__doc__
,__globals__
,__name__
,分别。
您会注意到提到的func_name
重命名属性之一。您将需要使用__name__
。
Python 3中的示例代码:
>>> def foo(a):
... print(a.__name__)
...
>>> def c():
... pass
...
>>>
>>> foo(c)
c
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句