Недавно я попробовал этот код, просто чтобы удовлетворить любопытство.
from * import * as *
if __name__ == '__main__':
z = *.zeros((3,3))
print(z)
Может кто-нибудь сказать мне, почему import * не считается допустимым вариантом?
Я действительно хотел бы иметь возможность просто импортировать каждую установленную/распознанную библиотеку в одну строку.
Должен ли я опубликовать отчет об ошибке или запрос функции?
Это будет новая функция, а не исправление ошибки.
Я понимаю, но ''' from * import * ''' по-прежнему не является допустимым вариантом.
Совершенно непонятно, как вы ожидаете, что это будет вести себя. Откуда Python узнает, где находятся все возможные модули и как будут разрешаться конфликты имен?
«Каждая установленная библиотека» почти наверняка будет включать имена, дублирующиеся между модулями. У вас не было бы ни малейшего представления о том, что означает любое данное имя, если бы это действительно было разрешено.
from specific_package import * уже считается плохой практикой, потому что невозможно определить, какие символы откуда берутся, просто взглянув на один исходный файл; импортировать все такие пакеты было бы намного хуже.
"Не заморачивайся" звучит довольно пренебрежительно. Нет ничего плохого в том, чтобы задать этот вопрос, и если идея не сработает, мы обязательно объясним, почему в ответе.
@IainShelvington Он может рекурсивно сканировать каждый каталог в пути поиска Python на наличие файлов .py, .pyc и .so, но это, безусловно, было бы плохой идеей, как по соображениям производительности, так и по более конкретной проблеме, поднятой jasonharper.
@JohnKugelman: я сказал не открывать запрос функции в системе отслеживания ошибок Python. Этот вопрос очень открыт для ответов.






С точки зрения Зачемimport *, from * import * и другие варианты не считаются допустимым синтаксисом в Python, что можно понять, бегло взглянув на грамматику Python. Грамматика для заявление об импорте:
import_stmt ::= "import" module ["as" identifier] ("," module ["as" identifier])*
| "from" relative_module "import" identifier ["as" identifier] ("," identifier ["as" identifier])*
| "from" relative_module "import" "(" identifier ["as" identifier] ("," identifier ["as" identifier])* [","] ")"
| "from" relative_module "import" "*"
module ::= (identifier ".")* identifier
relative_module ::= "."* module | "."+
Вы заметите, что каждый токен (кроме токенов буквального текста) сводится к некоторой комбинации токенов identifier. грамматика идентификаторов немного сложнее, но беглый просмотр правил должен прояснить, что символ * (U+002A) не является допустимым идентификатором. Это исключает такие конструкции, как import *, поскольку грамматика требует действительного идентификатора в позиции, где появляется *. Единственный случай, когда * разрешен в операторе импорта, — это когда он явно разрешен как буквальный текстовый токен. Это происходит только в альтернативе "from" relative_module "import" "*".
С точки зрения Зачем это было бы плохой идеей --
Из Дзен Питона:
In the face of ambiguity, refuse the temptation to guess.
Это часть обоснования дизайна Python, чтобы избежать двусмысленности и заставить разработчиков явно выбирать то, что они хотят.
Когда вы используете from * import *, вы импортируете каждое имя, определенное в каждом модуле. Это означает, что вы используете оба...
from lxml.etree.ElementTree import *
и
from xml.etree.ElementTree import *
... Итак, как узнать, принадлежит ли функция fromstring() в вашем пространстве имен lxml.etree, или xml.etree, или какой-то другой библиотеке, которая вообще не связана с XML?
Точно так же это означает, что у вас внезапно появляется функция loads, но вы не знаете, является ли она json.loads() или yaml.loads(), или, опять же, чем-то на 100% не связанным.
Это сделало бы код невозможным как для чтения, так и для написания.
*не является допустимым именем переменной. Вот почемуas *не работает.