【问题标题】:AttributeError: 'function' object has no attribute 'func_name' and python 3AttributeError:'function'对象没有属性'func_name'和python 3
【发布时间】:2020-05-23 06:25:16
【问题描述】:

我下载了以下代码:

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下工作。

【问题讨论】:

  • 您在寻找callback.__name__??老实说,如果你只是要打印它,你还不如打印callback...
  • 成功了,谢谢

标签: python python-3.x function callback python-2.x


【解决方案1】:

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__ /p>

您会注意到func_name 是被重命名的属性之一。您需要使用__name__

Python 3 中的示例代码:

>>> def foo(a):
...  print(a.__name__)
... 
>>> def c():
...  pass
... 
>>> 
>>> foo(c)
c

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2022-01-26
    • 2019-05-17
    • 2017-07-04
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多