Найти - Пользователи
Полная версия: пространство имен
Начало » Python для новичков » пространство имен
1 2
andrei186
Есть ОСНОВНОЙ_МОДУЛЬ.
В нем определна ФУНКЦИЯ
ОСНОВНОЙ_МОДУЛЬ импортирует ДРУГОЙ_МОДУЛЬ при помощи
from ДРУГОЙ_МОДУЛЬ import  ДРУГАЯ_ФУНКЦИЯ
а ДРУГАЯ_ФУНКЦИЯ содержит вызов
def ДРУГАЯ_ФУНКЦИЯ()
ФУНКЦИЯ()
Почему этот вызов возвращает
NameError: global name 'ФУНКЦИЯ' is not defined
и как это победить?
4kpt_IV
Вы прям так код и пишите?
andrei186
4kpt_IV
Вы прям так код и пишите?
прям так это как? Если в смысле кириллицы, то нет
kampella
from ДРУГОЙ_МОДУЛЬ import  ДРУГАЯ_ФУНКЦИЯ, ФУНКЦИЯ
andrei186
kampella
from ДРУГОЙ_МОДУЛЬ import ДРУГАЯ_ФУНКЦИЯ, ФУНКЦИЯ
ФУНКЦИЯ опредлена в ОСНОВНОМ_МОДУЛЕ
ayb
А с какого перепугу оно должно работать. Если ты не понимаешь как работает импорт, то тебе нужно читать книгу, там должно быть про это написано.
andrei186
ayb
А с какого перепугу оно должно работать. Если ты не понимаешь как работает импорт, то тебе нужно читать книгу, там должно быть про это написано.
А можно чуть подробнее, почему именно не должно работать?

У меня синтаксическая ошибка?
Или принципиальная, т.е. функция, определенная в импортируЮЩЕМ модуле, в принципе не может быть вызвана из импортируЕМОГО модуля?

В Книге я прочел, что from… import F импортирует функцию F в пространство имен импортирующего модуля, как если эта функция определена в импортирующем модуле, следовательно для нее должны быть доступны все переменные и функции импортирующего модуля.

ПС.Кстати, эта ветка “Python для новичков”, и если объяснить новичку, или хотя бы дать конкретную ссылку на Книгу недостойна твоей квалификации, зачем ты сюда заходишь?
FishHook
andrei186
Вы импортируете ФУНКЦИЮ, ничего кроме ФУНКЦИИ вы не импортируете и поэтому не получите. Нужна другая функция -импортируйте её отдельно. Так устроен импорт в питоне.
andrei186
FishHook
Вы импортируете ФУНКЦИЮ, ничего кроме ФУНКЦИИ вы не импортируете и поэтому не получите.
ранее мне сказали, что конструкция from…import f2 импортирует функцию f2(), но при этом еще и выполняет весь код, прописанный в импортируемом модуле.
Хорошо, если я пропишу вызов функции f1 из f2() таким образом:
importING_module:
#importING_module.py
from importED_module import f2
def f1():
какой-то код

importED_module:
#importED_module.py
def f2():
f1()
f2()
Тут
http://ru.diveintopython.net/fileinfo_fromimport.html
сказано:
атрибуты модуля types импортируются непосредственно в локальное пространство имен и, поэтому, становятся доступными напрямую, без указания имени модуля.
Я это понимаю как то, что два вышеуказанных модуля эквивалентны одному такого содержания:
#importING_module.py
def f2()
f1()

f2()

def f1()
какой-то код
Т.е. не имеет значения, в котором из двух модулей размещен вызов f2().
В чем моя ошибка?
FishHook
Нужна другая функция -импортируйте её отдельно.
Какая другая функция, что она должна делать и в каком модуле определена?
Rodegast
> Почему этот вызов возвращает…и как это победить?

Это особенность устройства функций. У каждой функции есть ссылка на глобальное пространство имён в котором она определена и функция использует только это пространство, а не тот контекст из которого её вызывают.
Вот как это можно победить (хреновый способ):
#p2.py
def foo2():
	foo()
#p1.py
from p2 import foo2
def foo():
	print "be-be-be"
foo2.func_globals.update({"foo":foo})
foo2()
При таком спосебе будет модифицированно глобальное пространство у всех функций из p2.py что не желательно.
По этому надо побеждать по другому (правильный способ):
#p2.py
def foo2():
	foo2.foo()
#p1.py
from p2 import foo2
def foo():
	print "be-be-be"
foo2.func_dict.update({"foo":foo})
foo2()
P.S. Всё что я тут написал это адовы костыли, по этому советую правильно проектировать программы и тогда тебе не придётся сталкиваться с чем-то подобным.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB