Уведомления

Группа в Telegram: @pythonsu

#1 Май 1, 2016 11:37:04

probnik
Зарегистрирован: 2016-04-30
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание пространства имен

Снова прошу у вас помощи , уважаемые форумчане.
У меня возникли сложности с пониманием пространства имен. Если быть точнее, то я понимаю теорию- глобальные \локальные переменные и области видимости и их взаимодействия ( то есть как из функции вызвать, например, глобальную переменную и её переназначить и\или использовать ) .если они будут заданы
например

a=1
def test():
    a=2
    def test_2():
        a=3
        print a
    def test_global():
        global a
        a='global'
    test_2()
    test_global()
    print a
print a
test()
print a
Но мне не понятен этот процесс на практике , если переменные не объявлены ранее ( не создано дерево)… то есть я хочу написать программу, которая бы могла создавать переменные и функции полученные из вне
если поступит запрос
add global a
create foo global
add foo b
get foo a
get foo c
create bar foo
add bar a
get bar a
get bar b
должно создаться что то вроде того
[code python]
a=1
def foo()
b=2
def bar()
a=3
[/code]
то есть мне непонятен процесс именно создания переменных\функций и get-нуть их тоже не выходит ( хотя это скорее всего из-за того что само дерево не создалось или… в общем я не знаю…
и ещё не соображу как чекнуть какое “дерево” имеется сейчас…( ниже выложу свой говнокод , там вроде что то выводится , но я недопонимаю что именно)…
не прошу у вас готового решения , а прошу направить в правильное русло (материал какой-нибудь , советы , возможно какие то конкретные действия)

попытался реализовать
1)что передается в программу ( тут по сути указывается каким должно быть дерево)
b.yaml
- 9
- add global a
- create foo global
- add foo b
- get foo a
- get foo c
- create bar foo
- add bar a
- get bar a
- get bar b
2)основной код программы
import yaml
import Queue
q = Queue.Queue()
spisok=yaml.load(open("b.yaml"))
for i in spisok:
  q.put(i)
l=0
#a=0
#b=0
#c=0
def add_fun ():
  if spase == 'global':
    global arg
    arg
    print spase
  else:
    arg
    print arg
def create_fun ():
  if arg == 'global':
    global spase
    spase
    print spase
  else:
    spase
    print spase
def get_fun ():
  pass
k = q.get()
while l < k:
  do, spase, arg = q.get().split()
  l=l+1
  if do == 'add':
    add_fun()
  elif do == 'create':
    create_fun ()
  elif do == 'get':
    get_fun ()
  else:
    print ('error end')
    break
print('good end')
3) вывод программы
global
foo
b
bar
a
good end
Премного благодарен . надеюсь сильно ругаться не будете за “чистоту” кода , я только учусь

Офлайн

#2 Май 1, 2016 23:33:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Создание пространства имен

probnik
а прошу направить в правильное русло
Вот вы придумали свои get add. По сути вы пытаетесь сочинить еще один язык программирования. Возникает вопрос зачем? Почему вы думаете что ваш язык будет лучше чем java c++ python?
Переменные и функции создаются при интерпретации кода на питоне. Есть import, __import__, eval, execfile, и т.п. Вы какой язык уже знаете? Вы питон уж очень извращенно пытаетесь использовать. Опишите подробнее задачу, так вообще непонятно откуда такие потребности могли возникнуть.



Отредактировано doza_and (Май 1, 2016 23:42:19)

Офлайн

#3 Май 2, 2016 00:35:18

probnik
Зарегистрирован: 2016-04-30
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание пространства имен

doza_and огромное спасибо , что помогаешь !

doza_and
По сути вы пытаетесь сочинить еще один язык программирования. Возникает вопрос зачем?
Ни в коем разе так не думаю. Делаю ошибки именно от незнания .
doza_and
Вы какой язык уже знаете?
по большому счету всерьез решил выучить python а так что то где то когда то читал и по delphi и по с++, но это было давно и не успешно.
doza_and
Опишите подробнее задачу, так вообще непонятно откуда такие потребности могли возникнуть.
это задача такая (на stepic.org выложили). дословно звучит так
Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.
В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.
Вашей программе на вход подаются следующие запросы:
create <namespace> <parent> –  создать новое пространство имен с именем <namespace> внутри пространства <parent>
add <namespace> <var> – добавить в пространство <namespace> переменную <var>
get <namespace> <var> – получить имя пространства, из которого будет взята переменная <var> при запросе из пространства <namespace>, или None, если такого пространства не существует
Рассмотрим набор запросов
add global a
create foo global
add foo b
create bar foo
add bar a
Структура пространств имен описанная данными запросами будет эквивалентна структуре пространств имен, созданной при выполнении данного кода
a = 0
def foo():
  b = 1
  def bar():
    a = 2
В основном теле программы мы объявляем переменную a, тем самым добавляя ее в пространство global. Далее мы объявляем функцию foo, что влечет за собой создание локального для нее пространства имен внутри пространства global. В нашем случае, это описывается командой create foo global. Далее мы объявляем внутри функции foo функцию bar, тем самым создавая пространство bar внутри пространства foo, и добавляем в bar переменную a.
Добавим запросы get к нашим запросам
get foo a
get foo c
get bar a
get bar b
Представим как это могло бы выглядеть в коде
a = 0
def foo():
  b = 1
  get(a)
  get(c)
  def bar():
    a = 2
    get(a)
    get(b)
 
Результатом запроса get будет имя пространства, из которого будет взята нужная переменная.
Например, результатом запроса get foo a будет global, потому что в пространстве foo не объявлена переменная a, но в пространстве global, внутри которого находится пространство foo, она объявлена. Аналогично, результатом запроса get bar b будет являться foo, а результатом работы get bar a будет являться bar.
Результатом get foo c будет являться None, потому что ни в пространстве foo, ни в его внешнем пространстве global не была объявлена переменная с.
Более формально, результатом работы get <namespace> <var> является
<namespace>, если в пространстве <namespace> была объявлена переменная <var>
get <parent> <var> – результат запроса к пространству, внутри которого было создано пространство <namespace>, если переменная не была объявлена
None, если не существует <parent>, т. е. <namespace> – это global
Формат входных данных
В первой строке дано число n (1 ≤ n ≤ 100) – число запросов.
В каждой из следующих n строк дано по одному запросу.
Запросы выполняются в порядке, в котором они даны во входных данных.
Имена пространства имен и имена переменных представляют из себя строки длины не более 10, состоящие из строчных латинских букв.
Формат выходных данных
Для каждого запроса get выведите в отдельной строке его результат.
Sample Input:
9
add global a
create foo global
add foo b
get foo a
get foo c
create bar foo
add bar a
get bar a
get bar b
Sample Output:
global
None
bar
foo
к сожалению она поставила меня в тупик , потому что, как вы заметили, такая программа не часто встретиться может .
Общую теорию я понял (как мне кажется) хорошо , но если поставить задачу под таким углом все моё “понимание” крошится о стену непонимания .
Гугля материал на эту тему ,я ничего дельного не нашел , кроме готового решения
решение:
class nmspc(list):
    names = {"global": ["None"],"None":[]}
    def create(self, space, parent):
        self.names[parent].append(space)
        self.names[space] = [parent]
    def add(self, space, var):
        self.names[space].append(var)
    def get(self, space, var):
        if space == "None":
            return
        if var in self.names[space]:
            print(space)
            return
        elif self.names[space][0] != "None":
            self.get(self.names[space][0], var)
            return
        else:
            print("None")
        return
a = nmspc()
n = int(input())
for i in range(n):
    s = input().split()
    if s[0] == "add":
        a.add(s[1], s[2])
    elif s[0] == "create":
        a.create(s[1], s[2])
    else:
        a.get(s[1], s[2])
Задача зачиталась , но при этом понимание “почему оно так” и “почему оно работает ” не пришло. Я попробовал реализовать этот функционал сам. Ничего дельного не вышло а я в итоге окончательно запутался . мне непонятен сам процесс создания .
Я считаю что если тема не понята идти дальше не имеет смысла. Зачем тогда вообще изучать язык если плюваться говнокодом.
Поэтому я обратился к знающим людям.
Надеюсь вас не слишком утруждают давать ответы на мои идиотские вопросы. Каждый совет для меня очень ценен.

Отредактировано probnik (Май 2, 2016 00:37:14)

Офлайн

#4 Май 2, 2016 03:37:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Создание пространства имен

probnik
по большому счету всерьез решил выучить python
А stepic тут при чём? Если хочешь выучить питон, возьми книжку по питону, где всё просто рассказывается и ты это запоминаешь.

python.org. tutorial
dip3

python.org. specification
python.org. library



Отредактировано py.user.next (Май 2, 2016 03:37:39)

Офлайн

#5 Май 2, 2016 08:00:31

probnik
Зарегистрирован: 2016-04-30
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание пространства имен

Благодарю за внимание к моему вопросу py.user.next

py.user.next
Если хочешь выучить питон, возьми книжку по питону, где всё просто рассказывается и ты это запоминаешь.
Я полностью с вами согласен , и я читаю книгу “Python на примерах. Практический курс по программированию”. Но я считаю хорошим тоном помимо чтения текста ещё и тестовые задания выполнять (не только из примеров, но и где нужно подумать самому), для лучшего усваивания материала, наработке набора текста, понимания логики программы. И плюс ко всему есть возможность ещё и видео уроки по пройденному материалу посмотреть, что эквивалентно получению материала от ещё одного автора. Повторение- мать учения.
Я думаю неважно откуда именно я взял пример , а важно то , что есть желание разбираться , развиваться , и этот пример очень ярко демонстрирует , что тема не понята и есть над чем работать.
.поправьте меня , если не прав. Для меня крайне ценны советы Знающих и Опытных людей.

Офлайн

#6 Май 2, 2016 08:13:41

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

Создание пространства имен

Эти задания это все херня - берешь реальную проблему и пытаешься её решить. Просто ты тестовое задание вроде бы сделал, но по факту у тебя в голове практически ничего не отложилось, что-то типа студента - зазубрил, сдал, забыл. А когда ты решаешь реальную проблему, у тебя есть стимул и есть чувство удовлетворения от того, что ты решил проблему.

Офлайн

#7 Май 2, 2016 08:52:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Создание пространства имен

probnik
Но я считаю хорошим тоном помимо чтения текста ещё и тестовые задания выполнять (не только из примеров, но и где нужно подумать самому)
Речь о том, что питон раз в десять проще этих заданий со stepic'а, поэтому за то же время можно изучить десяток понятий из питона. А сейчас ты сидишь и трахаешься с этим алгоритмом, который к питону никакого отношения не имеет. И ты думаешь, что это поможет тебе усвоить питон. Что ты собрался усваивать, если по питону ничего не читаешь?

Фактически, тебя просят станцевать румбу, а ты шнурки не можешь завязать на ботинках, потому что не знаешь, как узлы завязывать. И ты начинаешь танцевать румбу с развязанными шнурками. Может быть, ты и станцуешь что-то похожее, но шнурки ты как не умел завязывать, так и не умеешь. А это поважнее какого-то там танца будет.



Отредактировано py.user.next (Май 2, 2016 08:56:19)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version