属性错误:'function'对象没有属性'func_name',而python 3的属性为'func_name'。

问题描述 投票:1回答:1

我下载了以下代码。

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)

在python2下工作正常,但在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 python-3.x function callback python-2.x
1个回答
2
投票

在Python 3中,这种行为是意料之中的,因为它是从Python 2中改变的。根据这里的文档。

https:/docs.python.org3whatsnew3.0.html#operators andspecial-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
© www.soinside.com 2019 - 2024. All rights reserved.