AttributeError: у объекта 'function' нет атрибута 'func_name' и pythn3 - PullRequest
1 голос
/ 07 февраля 2020

Я скачал следующий код:

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.

1 Ответ

2 голосов
/ 07 февраля 2020

Такое поведение в Python 3 ожидается, поскольку оно было изменено с Python 2. Согласно документации здесь:

https://docs.python.org/3/whatsnew/3.0.html#operators -и-специальные-методы

Атрибуты функций с именем func_X были переименованы для использования формы __X__, освобождая эти имена в пространстве имен атрибутов функций для пользовательских атрибутов. То есть func_closure, func_code, func_defaults, func_dict, func_do c, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...