Импорт / наследование (не изменяемых) переменных из вложенных пакетов (как изменяемых) в Python 3.x - PullRequest
0 голосов
/ 10 сентября 2018

Есть ли простой способ "наследовать" (обрабатывать) неизменяемые находящиеся в более низких пакетах (не классах) как изменяемые значения в пакетах более высокого уровня - в идеалебез использования классов?

Существует множество, казалось бы, похожих вопросов, которые не охватывают эту ситуацию: Импорт между вложенными пакетами в Python 3 , Импорт пакетов одного уровня , Как импортировать функцию из модуля в той же папке? и Импорт модулей из родительской папки , просто назвать несколько.

Импорт вложенных переменных, которые были инициализированы в изменяемыезначения (список) работает как положено, но импорт переменных, инициализированных неизменяемым значениям (целое число), не работает. При импорте неизменяемых значений значение копируется - вместо использованияуказатель на переменную, которая содержит значение во вложенном пакете. Несколько копий означают, что изменения, сделанные на одном уровне, не будут видны на других уровнях.

Я три разаd создание вложенных (не изменяемых) переменных с уникальными изменяемыми значениями (такими как [Нет, 1], [Нет, 2] и т. д.), но это не помогло;ни один из них не использовал «import X» вместо «from X import».

Средой является Python 3.6.4 (Pydev 6.4.4 для Eclipse Oxygen, 4.7.3a) в Windows 10 Enterprise.Все 64 бит.

На приведенном ниже снимке экрана Eclipse «Level_1» (самый верхний пакет) содержит «Level_2», который содержит «Level_3».Level_3 содержит изменчивую переменную «Level_3_List» и неизменяемую переменную «Level_3_Integer».Каждый уровень импортирует переменные из уровня чуть ниже самого себя, и все уровни состоят из __ init __.py и файлов "function".Эта структура отображается в окне «Pydev Package Explorer».

Окно консоли показывает, что на уровне приложения «Level_3_List» имеет ожидаемое значение ['C', 'B', 'A'], в то время как “Level_3_Integer” имеет неожиданное (но технически правильное) значение"Никто".

Одна странность, которая может быть подсказкой: в «Level_1_Function» и «Level_2_Function» строка импорта для (изменяемого) «Level_3_List» помечена (желтые треугольники) как неиспользуемая, поскольку она импортирована в __ init __.py.Но без этой строки вы получите неопределенную ошибку имени, как только функция попытается использовать переменную.

Концептуально, мне нужно «наследование» для неизменяемых файлов, определенных внутри пакетов.Без создания, казалось бы, бесполезных (одноэлементных) классов или создания собственного целочисленного «типа» ( Как создать подкласс int и сделать его изменяемым ), как я могу поддерживать текущую инкапсулированную структуру, делая вложенные «не изменяемыеПеременная (Level_3_Integer) «изменяемый» на верхнем уровне?

И исключая использование полноточечной нотации и перемещение «не изменяемых» переменных в самый верхний пакет (оба из которых разрушают инкапсуляцию), является единственным действительно практичным решением для сохранения инкапсуляции в использовании (несколько бессмысленно)классы?

Screenshot of Project in Eclipse

...