Python: создать область видимости
От: Roman Odaisky Украина  
Дата: 03.01.13 16:22
Оценка: -1
Как в Питоне по-человечески отделить часть кода в отдельную область видимости?

Хочу:
namespace grammar:
    P = pyparsing

    comma_or_whitespace = P.White() | ","

    def seq(expr):
        return P.ZeroOrMore(expr + comma_or_whitespace.suppress()) + expr

    number = ...
    numbers = seq(number)

    ...

grammar.whatever.parseString(...)


Можно было бы написать class grammar, но тогда функции не будут видеть ранее определенные идентификаторы.

Пока придумал только такой хак:

def namespace(function):
    return type("NS", (), function())

@namespace
def grammar():
    ...
    return locals()

а по-человечески?
До последнего не верил в пирамиду Лебедева.
Re: Python: создать область видимости
От: monax  
Дата: 03.01.13 17:57
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>а по-человечески?


В питоне для таких целей используются модули.
Re[2]: Python: создать область видимости
От: Roman Odaisky Украина  
Дата: 03.01.13 18:33
Оценка:
Здравствуйте, monax, Вы писали:

RO>>а по-человечески?


M>В питоне для таких целей используются модули.


Вот пусть у тебя есть отдельный модуль, в котором описывается какая-нибудь грамматика, для чего требуется куча идентификаторов, большинство из которых определяются в одну строчку. Чтобы они не конфликтовали, надо их разнести по отдельным пространствам имен, но заводить на каждый чих отдельный файл было бы неудобно.
До последнего не верил в пирамиду Лебедева.
Re: Python: создать область видимости
От: Kogrom  
Дата: 03.01.13 19:08
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Можно было бы написать class grammar, но тогда функции не будут видеть ранее определенные идентификаторы.


Почему не будут? К переменным класса (статические переменные) можно обращаться с помощью имени класса (MyClass.myVar), либо через self, если используем объект. Если объект не создаём, то методы делать статическими.
Re[3]: Python: создать область видимости
От: monax  
Дата: 03.01.13 19:29
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Вот пусть у тебя есть отдельный модуль, в котором описывается какая-нибудь грамматика, для чего требуется куча идентификаторов, большинство из которых определяются в одну строчку. Чтобы они не конфликтовали, надо их разнести по отдельным пространствам имен, но заводить на каждый чих отдельный файл было бы неудобно.


Пока что на ум приходит dict, но хотелось бы увидеть реальный кусок кода, который ты хочешь запихнуть в namespace. Тут и классы вполне подходят, а названная тобой проблема с видимостью мне вообще непонятна. В общем, "Talk is cheap. Show me the code." (c).
Re[4]: Python: создать область видимости
От: Roman Odaisky Украина  
Дата: 03.01.13 19:32
Оценка:
Здравствуйте, monax, Вы писали:

RO>>Вот пусть у тебя есть отдельный модуль, в котором описывается какая-нибудь грамматика, для чего требуется куча идентификаторов, большинство из которых определяются в одну строчку. Чтобы они не конфликтовали, надо их разнести по отдельным пространствам имен, но заводить на каждый чих отдельный файл было бы неудобно.


M>Пока что на ум приходит dict, но хотелось бы увидеть реальный кусок кода, который ты хочешь запихнуть в namespace. Тут и классы вполне подходят, а названная тобой проблема с видимостью мне вообще непонятна. В общем, "Talk is cheap. Show me the code." (c).


В первом сообщении вполне себе репрезентативный кусок кода, который не будет работать внутри класса (например, seq не увидит P).
До последнего не верил в пирамиду Лебедева.
Re[5]: Python: создать область видимости
От: monax  
Дата: 04.01.13 02:57
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>В первом сообщении вполне себе репрезентативный кусок кода, который не будет работать внутри класса (например, seq не увидит P).


Тогда могу предположить несколько вариантов.

Во-первых, питоновские объекты
class grammar:
    def __init__(self):
        self.P = 10
        self.N = self.seq(10)

    def seq(self, expr):
        return expr * self.P

ns1 = grammar()

print ns1.P
print ns1.N


Во-вторых — питоновские модули.

В третьих — анализаторы. Ты уверен, что описывать грамматику на питоне — это то, что тебе надо? Может стоит взять парсер?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.