#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. Просто не используйте его.