2013-08-14 3 views
0

Насколько я понял, from module import * означает, что все из модуля будет доступно локально.Неожиданное поведение при загрузке модуля в Python

В моем коде я нашел:

from tkinter import * 

и

from tkinter import filedialog 

Оглядываясь назад, я полагал, что я мог бы бросить эту последнюю строчку, но он недоступен:

NameError: name 'filedialog' is not defined. 

Что мне не хватает?

+0

Чтобы держать его коротким, это ваш ответ: [FileDialog это ** ** модуль из Tkinter] [1] [1]: http://stackoverflow.com/questions/ 9239514/filedialog-tkinter-and-opening-files – angryfruitsalad

+0

Импорт '*' импорт * не * импортирует подмодуль. Он просто импортирует выбранный пакет и помещает все в глобальное пространство имен. Нет никакой разницы в «загруженных вещах» между 'import tkinter' и' from tkinter import * ', разница в том, что последний будет загрязнять пространство имен. Если файл '__init __. Py' не импортирует подмодули, то вы * должны * импортировать их явно (и это похоже на случай). – Bakuriu

ответ

1

Из того, что я понимаю, Tkinter представляет собой пакет (что означает, что он содержит другие модули). Из Tkinter import * будут предоставлены только модули по умолчанию.

из документации:

6.4.1. Импорт * Из пакета

Теперь, что происходит, когда пользователь пишет из sound.effects import *? В идеале можно было бы надеяться, что это как-то пойдет в файловую систему, найдет, какие подмодули присутствуют в пакете, и импортирует их все. Это может занять много времени, и импорт подмодулей может иметь нежелательные побочные эффекты, которые могут произойти только тогда, когда субмодуль явно импортируется.

Единственное решение для автора пакета - предоставить явный индекс пакета. Оператор import использует следующее соглашение: если код пакета init .py определяет список с именем all, он считается списком имен модулей, которые должны быть импортированы, когда из импорта пакета * встречается. Автору пакета рекомендуется сохранить этот список в актуальном состоянии при выпуске новой версии пакета. Авторы пакета могут также решить не поддерживать его, если они не видят использования для импорта * из своего пакета. Например, файл звуки/эффекты/инициализация .py может содержать следующий код:

Пожалуйста, прочитайте следующую запись для другого ответа на ваш вопрос. filedialog, tkinter and opening files

Смежные вопросы