Можем ли мы применить именованный импорт в Python (и «отключить» * импорт) - PullRequest
0 голосов
/ 14 июля 2020

Python позволяет импортировать символы из других модулей с помощью оператора import <symbol>. Точно так же я могу сказать from <module> import *, и он импортирует все символы из module.py.

Теперь, скажем, если я хочу запретить кому-либо импортировать * из моего модуля, могу ли я переопределить это функциональность и отключить? Т.е. могу ли я сделать так, чтобы пользователи моего модуля могли импортировать символы только по их именам, а не по шаблону *; скажем, если вы импортируете с использованием подстановочного знака *, интерпретатор Python выдаст ошибку.

Я знаю, что большинство линтеров Python поймают и помечают такой импорт по умолчанию (или если он настроен); но мне было интересно, есть ли способ реализовать это в самом коде модуля.

1 Ответ

2 голосов
/ 14 июля 2020

Вы можете определить, какие объекты, функции и классы будут импортированы с помощью import * из вашего модуля с помощью __all__

в начале вашего модуля, добавив:

__all__ = []

Все, что вы помещаете в этот список, можно импортировать с помощью from yourmodule import *. Ко всему остальному, что не имеет имени, все еще можно получить доступ с помощью yourmodule.objectname.

Пример: Предположим, у вас есть 2 функции в вашем модуле. Например:

def foo():
    print("Foo")

def bar():
    print("Bar")

Импорт * из вашего модуля приведет к импорту foo и bar.

Если вы добавите __all__ = ['foo'], то import * будет импортировать только foo. И если вы добавите __all__ = [], то import * ничего не должно импортировать.

Изменить: если вы оставите список пустым, ничего не будет импортировано, однако, если вы хотите, чтобы возникла ошибка, чтобы пользователи понимали, что вы не хотите разрешать импорт *, затем добавьте одну запись, которая завершится ошибкой, например: __all__=['NO_WILDCARD_IMPORT_ALLOWED'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...