是否有一种简单的方法来“继承”(处理)位于较低包(而非类)中的非变量作为较高级别包中的 mutable 值-理想情况下不使用类?
有许多看似相似的问题无法解决这种情况:Importing between nested packages in Python 3,Sibling package imports,How to import a function from a module in the same folder?和Importing modules from parent folder,仅举几例。
导入初始化为可变值(列表)的嵌套变量可以按预期方式工作,但导入初始化为 non-mutable 值(整数)的变量则不能。导入非变量时,该值将被复制 -而不是使用指向嵌套程序包中包含该值的变量的指针。多份副本意味着在一个级别进行的更改将在其他级别看不到。
我尝试创建具有唯一可变值(例如[None,1],[None,2]等)的嵌套(非可变)变量,但这没有帮助;都没有使用“导入X”代替“从X导入”。
环境是Windows 10 Enterprise上的Python 3.6.4(Eclipse Oxygen上为Pydev 6.4.4,4.7.3a)。一切都是64位。
在下面的Eclipse屏幕快照中,“ Level_1”(最上面的软件包)包含“ Level_2”,其中包含“ Level_3”。 Level_3包含可变变量“ Level_3_List”和非可变变量“ Level_3_Integer”。每个级别都从其自身下方的级别导入变量,并且所有级别均由__ init __.py和“功能”文件组成。该结构显示在“ Pydev软件包资源管理器”窗口中。
控制台窗口显示,在应用程序级别,“ Level_3_List”的预期值为['C','B','A'],而“ Level_3_Integer”的意外值(但在技术上正确)为“ None” 。
一个奇怪的线索:在“ Level_1_Function”和“ Level_2_Function”中,(可变)“ Level_3_List”的导入行被标记(黄色三角形)未使用,因为它是在__init __.py中导入的。但是,如果没有该行,则该函数尝试使用该变量时会出现未定义的名称错误。
从概念上讲,我需要对包中定义的非变量进行“继承”。在不创建看似毫无意义的类(单例)或创建自己的整数“类型”(How to subclass int and make it mutable)的情况下,如何在保持嵌套的“非可变”变量(Level_3_Integer)为“可变”的同时保持当前的封装结构顶层?
除了使用全点分表示法并将“非可变”变量移动到最顶层的程序包(两者都破坏封装)之外,维护(使用(毫无意义的)类)封装的唯一切实可行的解决方案是什么? / p>