субота, 16 квітня 2016 р.

Stepic.org 1.4 Пространства имён и области видимости – Шаг 8



Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.
В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.
Вашей программе на вход подаются следующие запросы:
  • 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])

3 коментарі:

  1. Спасибо! А я так и не понял, как к ней подступиться.

    ВідповістиВидалити
    Відповіді
    1. Вся магия в рекурсивной функции get() ...
      и форматах данных, которые были обговорены участниками курса ..

      Видалити
  2. Slot Machines Online - JTGHub
    In Slot 정읍 출장마사지 Machines Online, players can 서울특별 출장마사지 choose from a range 서울특별 출장샵 of games ranging from standard slot machines to video poker, 목포 출장샵 video poker, bingo and so 사천 출장샵 on.

    ВідповістиВидалити