Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 10
1

Как правильно делать пространства имён?

02.12.2013, 00:25. Показов 2781. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Переписываю программу с C++ на python по той причине, что обнаружил для себя модуль bigfloat, позволяющий вручную задавать определённую точность вычислений. На сях пробовал gmp.h, но возникала уйма проблем при использовании различных методов из math.h. Ситуация плачевна, на C++ переписывалась программа с pascal со своим набором goto.. Возник вопрос, как на python можно расширить область определения одной функции до другой..скажем, есть код на сях:
C++
1
2
3
4
5
6
7
8
9
10
void bla(){
    double a=1,b=2;
   //далее куча других переменных
}
int main(){
    bla()
    a++
    b++
   //куча других вычислений
}
В python-е функции должны чего-то возвращать, как понимаю. Но как лучше поступить в данном случае? Возвращать словарик из функции с набором параметров? Или же можно расширить их область "видимости" переменных из bla() применением global?
Также возникает вопрос, как заменить обилие goto в дремучей программе при переписи на python? Пока только находил решения вида генерации исключений, модуля goto.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2013, 00:25
Ответы с готовыми решениями:

Как запретить переименование пространства имен в xml?
Я обрабатываю xml документ c помощью lxml. Провожу поиск и замену значений тегов, но после...

Пространства имён
Бодрого времени суток. Python 3 Подскажите плиз по пространству имён. Есть структура: /...

почему то не правильно как то работает скрипт или пространства имен
Есть скрипт от цмс вордпресс и там создаю плагин и класс, из этого класса мы вызываем функцию...

В чем разница между подключением пространства имен в начале файла и внутри другого пространства имен?
Привет! Есть свой класс: namespace MyNamespace { public class MyClass { }

Что делать c ошибкой "Не удалось найти имя типа или пространства имен"?
Ошибка 1 Не удалось найти имя типа или пространства имен "Methods" (пропущена директива using или...

12
561 / 484 / 168
Регистрация: 14.02.2012
Сообщений: 1,561
02.12.2013, 00:33 2
yavalvas, это, как минимум, плохое знание архитектуры программы. Но если так сильно надо, то почитайте об nonlocal. Хотя советую Вам пересмотреть алгоритм программы, ибо используя такие методы как goto, Вы делаете код ужасно нечитабельным.

nonlocal
Инструкция nonlocal

Данная инструкция, дает возможность изменять значение переменных внутри функций, которые как бы должны быть локальными, то есть использоваться только внутри функции.
Инструкция работает только когда мы вызываем ее внутри функции.

Пример правильного рабочего варианта:

Python
1
2
def func():
    nonlocal name1, name2, ..
Данная инструкция существует только в версии Python 3.0.
-----------------------------------------------------------------

Инструкции global и nonlocal несколько ограничивают
правила поиска:
• global вынуждает интерпретатор начинать поиск имен с области объемлющего модуля и позволяет присваивать переменным новые значения. Область поиска простирается вплоть до встроенной области видимости, если искомое имя не будет найдено в модуле, при этом операция присваивания значений глобальным именам всегда будет создавать или изменять переменные в области видимости модуля.

• nonlocal ограничивает область поиска областями видимости объемлющих
функций она требует, чтобы перечисленные в инструкции имена уже существовали, и позволяет присваивать им новые значения. В область поиска не входят глобальная и встроенная области видимости.


Инструкция nonlocal в действии:

Python
1
2
3
4
5
6
7
8
9
10
11
>>> def tester(start):
...     state = start # Обращение к нелокальным переменным 
...     def nested(label):         # действует как обычно
...         print(label, state)    # Извлекает значение state из области
...     return nested              # видимости объемлющей функции
...
>>> F = tester(0)
>>> F(‘spam’)
spam 0
>>> F(‘ham’)
ham 0
Функции tester, которая создает и возвращает вложенную функцию nested. Обращение к переменной state из вложенной функции отображается на локальную область видимости функции tester, с применением привычных правил поиска.
-----------------------------------------------------------------


nonlocal для изменения переменных:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> def tester(start):
...     state = start  # В каждом вызове сохраняется свое значение state
...     def nested(label):
...         nonlocal state      # Объект state находится 
...         print(label, state) # в объемлющей области видимости
...         state += 1 # Изменит значение переменной, объявленной как nonlocal
...     return nested
...
>>> F = tester(0)
>>> F(‘spam’)          # Будет увеличивать значение state при каждом вызове
spam 0
>>> F(‘ham’)
ham 1
>>> F(‘eggs’)
eggs 2
Переменную state, локальную для функции tester, объявляем в функции nested с помощью инструкции nonlocal, мы сможем изменять ее внутри функции nested.
-----------------------------------------------------------------

Граничные случаи:

Нельзя
создавать имена в объемлющей области видимости с помощью инструкции.


Python
1
2
3
4
5
6
7
8
>>> def tester(start):
...     def nested(label):
...         nonlocal state     # Нелокальные переменные должны существовать!
...         state = 0
...         print(label, state)
...     return nested
...
SyntaxError: no binding for nonlocal ‘state’ found
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> def tester(start):
...     def nested(label):
...         global state       # Глобальные переменные могут отсутствовать
...         state = 0          # Создаст переменную в области видимости модуля
...         print(label, state)
...     return nested
...
 
>>> F = tester(0)
>>> F(‘abc’)
abc 0
>>> state
0
-----------------------------------------------------------------

Поиск нелокальных переменных не производится за пределами инструкций def ни в глобальной области видимости объемлющего модуля, ни во встроенной области видимости, даже если переменные с такими именами там существуют:
Python
1
2
3
4
5
6
7
8
9
>>> spam = 99
>>> def tester():
...     def nested():
...         nonlocal spam  # Переменная должна быть внутри def, а не в модуле!
...         print(‘Current=, spam)
...         spam += 1
...     return nested
...
SyntaxError: no binding for nonlocal ‘spam’ found
-----------------------------------------------------------------

Сохранение информации с помощью классов:
пока только пример кода с комментариями, так как классы мы не изучали!
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> class tester:      # Альтернативное решение на основе классов (Часть VI)
...     def __init__(self, start): # Конструктор объекта,
...         self.state = start     # сохранение информации в новом объекте
...     def nested(self, label):
...         print(label, self.state)   # Явное обращение к информации
...         self.state += 1            # Изменения всегда допустимы
...
>>> F = tester(0)      # Создаст экземпляр класса, вызовет __init__
>>> F.nested(‘spam’)   # Ссылка на F будет передана в аргументе self
spam 0
>>> F.nested(‘ham’)
ham 1
>>> G = tester(42)     # Каждый экземпляр получает свою копию информации
>>> G.nested(‘toast’)  # Изменения в одном объекте не сказываются на других
toast 42
>>> G.nested(‘bacon’)
bacon 43
>>> F.nested(‘eggs’)   # В объекте F сохранилась прежняя информация
eggs 2
>>> F.state            # Информация может быть получена за пределами класса
3
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
02.12.2013, 01:00 3
Цитата Сообщение от ВАСИЛЕВС Посмотреть сообщение
плохое знание архитектуры программы
Согласен.
Я считаю, что раз программа переписывается это хороший повод улучшить её и изменить архитектуру. Просто у вас получается дикий быко код.

Добавлено через 13 минут
Цитата Сообщение от yavalvas Посмотреть сообщение
В python-е функции должны чего-то возвращать, как понимаю
Не обязательно, если функция на пример просто выводит какое-то значение, то она не обязана ни чего возвращать.
Цитата Сообщение от yavalvas Посмотреть сообщение
Но как лучше поступить в данном случае? Возвращать словарик из функции с набором параметров?
В каждой задаче своё решение, нужно разбирать конкретную задачу и решать как поступить.
Цитата Сообщение от yavalvas Посмотреть сообщение
как заменить обилие goto
Раз использовался goto значит программа была не правильно спроектирована и её точно нужно переделывать.
0
0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 10
02.12.2013, 01:11  [ТС] 4
Цитата Сообщение от tsar925 Посмотреть сообщение
Согласен.
Я считаю, что раз программа переписывается это хороший повод улучшить её и изменить архитектуру. Просто у вас получается дикий быко код.

Добавлено через 13 минут

Не обязательно, если функция на пример просто выводит какое-то значение, то она не обязана ни чего возвращать.

В каждой задаче своё решение, нужно разбирать конкретную задачу и решать как поступить.
Раз использовался goto значит программа была не правильно спроектирована и её точно нужно переделывать.
Прекрасно понимаю, что нужно пересмотреть архитектуру. Но распутывание спагетти-кода не представляется возможным в связи с тем, что сроки поджимают. В python функция всегда что-то возвращает, как мне известно. Если не писать return, то вернёт None. Вся соль в том, как расширить пространство имён, либо как организовать обмен значениями между main() и bla().Программа проектировалась не мной и где-то пару десятилетий назад. Составил было алгоритм для распутывания goto и понял, что переписывание в более-менее удобоваримом виде за короткое время не представляется возможным, поэтому уж лучше набыдлокодить.
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
02.12.2013, 01:14 5
Юзай
Python
1
global
но можешь получить много трудно уловимых ошибок и проблем.
0
0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 10
02.12.2013, 01:20  [ТС] 6
Цитата Сообщение от ВАСИЛЕВС Посмотреть сообщение
yavalvas, это, как минимум, плохое знание архитектуры программы. Но если так сильно надо, то почитайте об nonlocal. Хотя советую Вам пересмотреть алгоритм программы, ибо используя такие методы как goto, Вы делаете код ужасно нечитабельным.
Python3 из-за не подойдёт ввиду отсутствия модулей. Спасибо за предложенную возможность, попробовал.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.12.2013, 01:25 7
Цитата Сообщение от yavalvas Посмотреть сообщение
Ситуация плачевна, на C++ переписывалась программа с pascal со своим набором goto
напиши задание
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
02.12.2013, 09:16 8
yavalvas, что же за задача, что без goto трудно... Выложите задание.
0
0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 10
04.12.2013, 10:56  [ТС] 9
Цитата Сообщение от Wolkodav Посмотреть сообщение
yavalvas, что же за задача, что без goto трудно... Выложите задание.
На pascal-е вот. На C переделанное ничем почти не отличается.

Расчет интерферометра

 Комментарий модератора 
правила
5.19. Запрещено размещать ссылки на задания и коды программ, расположенные на других сайтах. Вопросы и коды программ должны размещаться на форуме.
Вложения
Тип файла: zip text.pas.zip (10.2 Кб, 6 просмотров)
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
04.12.2013, 14:38 10
yavalvas, задание, а не код)
0
0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 10
04.12.2013, 20:22  [ТС] 11
Цитата Сообщение от Wolkodav Посмотреть сообщение
yavalvas, задание, а не код)
Ну извольтесс, задание не стоит как-то разглашать, да и это не относится к вопросу в теме. А по коду и так не понятно, какое задание. Алгоритм там заложен правильный, вот только распутать его нелегко.

Добавлено через 1 минуту
Цитата Сообщение от Wolkodav Посмотреть сообщение
yavalvas, задание, а не код)
Да и я оставлял ссылку на dumpz, это уже cf преобразовал.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.12.2013, 20:45 12
Цитата Сообщение от yavalvas Посмотреть сообщение
Ну извольтесс, задание не стоит как-то разглашать, да и это не относится к вопросу в теме.
задание одно, а его реализаций может быть множество

Цитата Сообщение от yavalvas Посмотреть сообщение
Да и я оставлял ссылку на dumpz, это уже cf преобразовал.
он может сдохнуть, поэтому весь код должен размещаться на форуме

Цитата Сообщение от yavalvas Посмотреть сообщение
А по коду и так не понятно, какое задание.
тот код лучше стереть
во-первых, автор использует глобальные переменные, а не инкапсулирует, во-вторых, автор использует goto (и с каждой строчкой всё больше и больше), в-третьих, он использует короткие, ничего не значащие имена, в-чётвертых, он использует повторы вроде sss1, sss2, sss3 вместо того, чтобы сделать массивы, в-пятых, пишет одно и то же для вывода, вместо того, чтобы написать обёртку, в-шестых, там пошёл копипаст и он комментариями уже пишет пояснения, потому что без комментариев ничего не понятно уже

короче, полный комлект

Цитата Сообщение от yavalvas Посмотреть сообщение
Алгоритм там заложен правильный, вот только распутать его нелегко.
и зря время тратишь, это некачественный код (он нечитаемый)
автор, похоже, не только не знает правила хорошего тона, но и писал его в спешке
1
0 / 0 / 0
Регистрация: 27.08.2013
Сообщений: 10
04.12.2013, 22:18  [ТС] 13
Цитата Сообщение от accept Посмотреть сообщение
и зря время тратишь, это некачественный код (он нечитаемый)
автор, похоже, не только не знает правила хорошего тона, но и писал его в спешке
А ещё если бы я не разобрал бы этот "мегакод", то меня бы вполне возможно отчислили из одного заведения) Хотя если бы полностью разобрал, то был бы уже в дурке. Уже успел настрадаться и смириться. И его действительно было бы проще переписать с нуля..только всё и сразу осознавать, что в энтом коде не легко..распутывать те goto тоже не в кайф.
0
04.12.2013, 22:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2013, 22:18
Помогаю со студенческими работами здесь

Имя типа или пространства имен отсутствует в пространстве имен
Подскажите решение проблемы. Целиком код:

Имя типа или пространства имен отсутствует в пространстве имён
Доброго времени суток. Делаю пример SportsStore из книги "ASP.NET MVC 3 Framework с примерами на...

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Как импортировать println() из пространства имен?
Помнится в C# была такая возможность using System; а в джаве что то не нашел такое, а то надоело...

Как удалить переменную из пространства имен js?
как удалить переменную из пространства имен js?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru