Импорт пользовательского модуля, содержащего перегруженную функцию печати в python, генерирующую ошибку атрибута

#python #import #overloading #python-import

#python #импорт #перегрузка #python-импорт

Вопрос:

Я использую Pycharm IDE. Я пытаюсь импортировать файл, и это вызывает ошибку атрибута. Я создал файл Python testing.py:

     import decimal

    def print(num, round_digits=3):
            if (type(num) == float or type(num) == decimal.Decimal) and round_digits >=0:
                    __builtins__.print(round(num, round_digits))
            else:
                    __builtins__.print(num)
  

В том же каталоге я написал файл test.py:

     import testing

    testing.print(0.17 * 0.3064,2)
  

Запуск этого файла приводит к этой ошибке:

 Traceback (most recent call last):

File "C:/Users/anura/PycharmProjects/pythonProject/test.py", line 3, in <module>
    testing.print(0.17 * 0.3064,2)

File "C:UsersanuraPycharmProjectspythonProjecttesting.py", line 5, in print
    __builtins__.print(round(num, round_digits))

AttributeError: 'dict' object has no attribute 'print'
  

Ответ №1:

Вы хотите использовать builtins , а не __builtins__ . Содержимое __builtins__ — это деталь реализации.

Поэтому измените свой код на

 import builtins    
import decimal

def print(num, round_digits=3):
    if (type(num) == float or type(num) == decimal.Decimal) and round_digits >=0:
        builtins.print(round(num, round_digits))
    else:
        builtins.print(num)
  

Дополнительное предложение: возможно, вы захотите заменить type(num) == float на isinstance(num, float) . isinstance разрешает подклассы данного класса.

Комментарии:

1. Спасибо. Я все еще не понимаю разницы между встроенными и встроенными .

2. Согласно документации builtins «обеспечивает прямой доступ ко всем «встроенным» идентификаторам Python». __builtins__ это внутренняя деталь. Это может быть или не быть там, и вы не должны полагаться на это. Различные реализации Python (CPython, PyPy, …) могут использовать его по-разному (или вообще не использовать), и он может даже меняться между версиями Python. Просто не используйте его.