Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 7, 2016 23:19:43

andrei186
Зарегистрирован: 2016-02-04
Сообщения: 90
Репутация: +  -1  -
Профиль   Отправить e-mail  

пространство имен

Есть ОСНОВНОЙ_МОДУЛЬ.
В нем определна ФУНКЦИЯ
ОСНОВНОЙ_МОДУЛЬ импортирует ДРУГОЙ_МОДУЛЬ при помощи

from ДРУГОЙ_МОДУЛЬ import  ДРУГАЯ_ФУНКЦИЯ
а ДРУГАЯ_ФУНКЦИЯ содержит вызов
def ДРУГАЯ_ФУНКЦИЯ()
ФУНКЦИЯ()
Почему этот вызов возвращает
NameError: global name 'ФУНКЦИЯ' is not defined
и как это победить?

Отредактировано andrei186 (Фев. 7, 2016 23:58:54)

Офлайн

#2 Фев. 7, 2016 23:21:38

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

пространство имен

Вы прям так код и пишите?

Офлайн

#3 Фев. 7, 2016 23:23:24

andrei186
Зарегистрирован: 2016-02-04
Сообщения: 90
Репутация: +  -1  -
Профиль   Отправить e-mail  

пространство имен

4kpt_IV
Вы прям так код и пишите?
прям так это как? Если в смысле кириллицы, то нет

Офлайн

#4 Фев. 7, 2016 23:43:13

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

пространство имен

from ДРУГОЙ_МОДУЛЬ import  ДРУГАЯ_ФУНКЦИЯ, ФУНКЦИЯ

Офлайн

#5 Фев. 7, 2016 23:56:01

andrei186
Зарегистрирован: 2016-02-04
Сообщения: 90
Репутация: +  -1  -
Профиль   Отправить e-mail  

пространство имен

kampella
from ДРУГОЙ_МОДУЛЬ import ДРУГАЯ_ФУНКЦИЯ, ФУНКЦИЯ
ФУНКЦИЯ опредлена в ОСНОВНОМ_МОДУЛЕ

Офлайн

#6 Фев. 8, 2016 01:04:25

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

пространство имен

А с какого перепугу оно должно работать. Если ты не понимаешь как работает импорт, то тебе нужно читать книгу, там должно быть про это написано.

Офлайн

#7 Фев. 8, 2016 09:00:45

andrei186
Зарегистрирован: 2016-02-04
Сообщения: 90
Репутация: +  -1  -
Профиль   Отправить e-mail  

пространство имен

ayb
А с какого перепугу оно должно работать. Если ты не понимаешь как работает импорт, то тебе нужно читать книгу, там должно быть про это написано.
А можно чуть подробнее, почему именно не должно работать?

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

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

ПС.Кстати, эта ветка “Python для новичков”, и если объяснить новичку, или хотя бы дать конкретную ссылку на Книгу недостойна твоей квалификации, зачем ты сюда заходишь?

Отредактировано andrei186 (Фев. 8, 2016 09:09:15)

Офлайн

#8 Фев. 8, 2016 09:27:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

пространство имен

andrei186
Вы импортируете ФУНКЦИЮ, ничего кроме ФУНКЦИИ вы не импортируете и поэтому не получите. Нужна другая функция -импортируйте её отдельно. Так устроен импорт в питоне.



Офлайн

#9 Фев. 8, 2016 10:17:33

andrei186
Зарегистрирован: 2016-02-04
Сообщения: 90
Репутация: +  -1  -
Профиль   Отправить e-mail  

пространство имен

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
Нужна другая функция -импортируйте её отдельно.
Какая другая функция, что она должна делать и в каком модуле определена?

Отредактировано andrei186 (Фев. 8, 2016 11:19:41)

Офлайн

#10 Фев. 8, 2016 10:32:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2822
Репутация: +  185  -
Профиль   Отправить e-mail  

пространство имен

> Почему этот вызов возвращает…и как это победить?

Это особенность устройства функций. У каждой функции есть ссылка на глобальное пространство имён в котором она определена и функция использует только это пространство, а не тот контекст из которого её вызывают.
Вот как это можно победить (хреновый способ):

#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. Всё что я тут написал это адовы костыли, по этому советую правильно проектировать программы и тогда тебе не придётся сталкиваться с чем-то подобным.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Фев. 8, 2016 11:33:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version