我正在重构一个大型程序程序(在一个文件夹中实现了许多文件),并使用包将文件分组为面向对象的结构。该应用程序使用tKinter(可能是红色鲱鱼),并且正在Eclipse Kepler上(在Win7上)使用PyDev开发。

它确实使用了一些类,但是将包结构(参见下文)转换为类并不是首选的解决方案(除非这是获得我想要的唯一合理的方法)。

在4层程序包的底部,我定义了一个常量(“ conA”),一个函数(“ funcB”)和一个变量(“ varC”)。从下至上,__init__.py每个级别的文件(在实现程序包的(嵌套)文件夹中)包含:

from .levelbelowModuleName import conA

from .levelbelowModuleName import funcB

from .levelbelowModuleName import varC

以便“递归”导入使“ level4”实体在所有级别上均通过其“ level4”名称可见。

在更高级别的程序包中,对所有实体的“只读”引用不会引起警告/错误消息。到目前为止没有问题。

但是,当尝试在更高级别的包中更新“ varC”时,我收到两个警告:1)文件顶部的“未使用的导入:varC”警告,以及2)在更新函数(具有“全局varC”)内部”语句)在“ varC =”行出现“未使用的变量:varC”警告。到目前为止还可以,因为没有关联两个“ varC”(但请参见下面的令人讨厌的附带问题)。

我认为(从Lutz的“ Learning Python”书的第23/24章推论),导入的名称(在各个级别上)都将引用同一个对象(地址),因此,更新了位于“侄子”中的变量(兄弟孩子)包会起作用。将“ varC”提升到最近的公共祖先程序包(问题程序包的直接父级,“侄子”的祖父母)似乎是一种有效的解决方法(它消除了警告)–但这破坏了面向对象程序包的目的结构体。

转换为绝对进口没有帮助。重命名/别名化“ varC”(在导入中使用“ as”)没有帮助。

顺便说一句,在更高级别的模块中使用的更新行是“ varC = X.getTable()”;这从定制类返回tKinter IntVars的矩阵(列表列表)。

棘手的问题是:在问题文件中的任何位置对“ varC”的“只读”引用,例如在文件顶部还是函数内部的“ print(varC)”,都将消除这两种警告,从而隐藏了问题。

有办法吃我的蛋糕吗?是否有“非类”方式使“ varC”驻留在第4级,并且仍可以由更高级别的包更新?还是使用共同的祖先是唯一可行的简单易懂的“非类”方法?

PS在输入此问题时建议的相关问题中,似乎没有一个适用。一个类似但更简单(而非嵌套)的问题是:如何从另一个模块更改模块变量?

新增2015-03-27:

这是实际文件的两个Eclipse屏幕快照。(对于不熟悉Eclipse的用户,将__init__.py显示为具有软件包名称的选项卡。)第一幅图显示了递归导入(从下到上)。第二个显示函数,“ SiteSpecificReports”的“未使用的导入”(黄色三角形)警告。蓝色突出显示的行是“未使用的变量”警告所在的位置(它神秘地消失了)。

忽略与LongitudeReports有关的一切,它本质上是MessageCountReports的克隆。为了清楚起见,我已隐藏了与该问题无关的所有代码(例如tKinter调用)。忽略文件名上的红色“ X”;都是tKinter的“初始时间”类型不匹配,这些不匹配在运行代码时消失(如__init__.pyMessageCountReports中“ SiteSpecificReports”上方的注释)。

在模块层次结构中,问题文件以灰色突出显示。“ A_Mainline.py”是执行点,其下的所有内容都是要重构的代码(有些已经移至该文件上方的软件包中)。最后,除CZQX外,“ SiteSpecific”下的所有子包都是占位符,并且仅包含一个空__init__.py文件。

更新了2105-10-23

所有这些背后的目的是通过将每个模块分成几个源文件来将文件大小保持在合理的水平。

接受的答案(包括它的链接)提供了我需要的线索。我的问题是,当我将一个文件/模块重构为几个子文件(每个子文件都包含变量定义和修改它们的函数)时,我认为每个子文件都是类类的“黑匣子”对象,而不是更多正确地,一个简单的“将文件插入更高级别的文件”命令(就像编辑器的“粘贴”命令一样)。

我的想法是,递归导入实际上将递归地将较低级别的变量的地址提升到较高级别的“init.py”命名空间中,从而使这些变量对模块的所有其他子文件可见(谁仅引用那些变量)-并允许我吃蛋糕(本地化定义)并且也可以吃(变量在最高级别可用)。这种方法对我来说适用于其他编译语言,尤其是ADA 83。

创建子文件时,似乎要使变量对其他子文件可见,您需要在最顶层的文件而不是最底层的文件中定义变量-这与我尝试使用的“对象化”方法不符。有点遗憾,这种方法行不通,因为变量的位置使它难以在其他模块中重用子文件。将每个文件转换为一个类应该可以完成我所追求的工作-但是,当您需要的只是“在此处插入此代码块”效果时,这似乎毫无意义。

无论如何,重要的是现在一切正常。

解决方案

您缺少python中名称和值之间的区别。名称位于命名空间中并指向值。当你说:

from .blah import Foo

您正在创建一个新的在当前的命名空间名称,它指向相同的值是Foo在关卡blah命名空间。如果之后您说:

Foo = 1

这会改变你的本地命名空间的 Foo为指向1,但它确实没有什么blah.Foo-你必须明确地说,blah.Foo = 1改名字Foo是生命blah。

这篇博客文章很容易澄清。

python 结构体嵌套_Python 3不更新嵌套包中的变量(使用“递归”相对导入)相关推荐

  1. python 结构体数组_python实现结构体数组(初始化并赋值)

    标签: C语言中结构体数组概念及定义 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这 ...

  2. 原 C语言之强大的结构体,【C语言资料更新】结构体的“卫浴”(位域)

    文/Edward 接下来再回到我们结构体的话题中来,我们之前讲结构体的时候,都是用int,char之类的数据类型来定义结构体的成员变量的,这些成员变量都有一个共性,就是他们的长度都是一个字节,或者一个 ...

  3.  一个复数可以用实部和虚部两部分组成,a1 = 1.2 + 3.4i,其中1.2是实部,3.4是虚部。定义一个结构体ComplexNumber,包含imaginary和real两个成员变量,能够表示

    题目原文     一个复数可以用实部和虚部两部分组成,a1 = 1.2 + 3.4i,其中1.2是实部,3.4是虚部.定义一个结构体ComplexNumber,包含imaginary和real两个成 ...

  4. ctypes python 结构体_Python 中 ctypes 的使用

    Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件.先来看一下 ctypes 怎么使 ...

  5. python结构体_Python对象初探

    欢迎关注微信公众号--Python与统计分析,一起学习,一起交流. 相信所有学过Python的人都听过这样一句话:Python中,一切皆对象.一个整数是一个对象,产生这个整数的类int也是一个对象.函 ...

  6. python结构体_Python实现结构体代码实例

    Python实现结构体代码实例 这篇文章主要介绍了Python实现结构体代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # python 使 ...

  7. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

  8. python结构体数组传出接收c动态库_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  9. python结构体排序

    文章目录 一个参数比较 多个参数比较 在c/c++中,遇到结构体排序类似的问题时可以直接用struct定义一个结构体,然后重写cmp函数实现结构体排序,而在python中,没有结构体,那么如何实现结构 ...

最新文章

  1. 怎么看python帮助手册常见问题商家认证_python认证
  2. 各个数据库取前10行记录
  3. 找出数组中最长的连续数字序列(JavaScript实现)
  4. (转)✈工欲善其事,必先利其器✔™
  5. Matplotlib实例教程(十一)堆栈图
  6. 自建fasttext类历险记
  7. android 上线apk,码云 Android apk 在线构建功能上线啦!
  8. R可视化lend_club 全球最大的P2P平台数据75W条
  9. 将h.264裸码流推送到RTMP服务器
  10. 刚进职场的新人,这6点一定要牢记
  11. idea java gitignore,关于idea的gitignore文件编写及解决ignore文件不生效问题
  12. cdr多页面排版_比AI更好用的文字排版软件推荐!
  13. Web Worker API
  14. mid=(left+right)1什么含义
  15. 汽车域控制器架构和OTA的心脏:网关的四大豪门(上)
  16. vector实现 并交差 集实例
  17. 微信记账本小程序(代码+功能介绍)
  18. 腾讯云2022年双11云服务器配置及报价表汇总
  19. unity android录制视频教程,Unity3d 录屏功能教程指南 | Cross Platform Replay Kit
  20. 风格迁移篇--StarGAN:用于多域图像到图像翻译的统一生成对抗网络

热门文章

  1. UVA 10003 Cutting Sticks (区间dp)
  2. 嵌入式软件设计第11次实验报告
  3. Jackson(ObjectMapper)的简单使用(可转xml)
  4. error LNK2005:错误改正方法
  5. lambda表达式不使用委托(delegate) 用FUNC
  6. java 多线程操作List,已经做了同步synchronized,还会有ConcurrentModificationException,知道为什么吗?...
  7. WebForm与MVC模式优缺点
  8. PHP命令行脚本接收传入参数的三种方式
  9. Python可视化库Matplotlib的使用
  10. 使用ionic2开发一个登录功能