当前位置: 首页 > 面试题库 >

具有相同名称的Python模块(即,重复使用软件包中的标准模块名称)

王翰墨
2023-03-14
问题内容

假设我有一个包含模块的软件包:

SWS/
  __init.py__
  foo.py
  bar.py
  time.py

并且这些模块需要引用彼此包含的功能。似乎我的time.py模块遇到了问题,因为有一个同名的标准模块。

例如,在我的foo.py模块同时需要我SWS.time和标准pythontime
模块的情况下,我会遇到麻烦,因为解释器会在程序包内部查找并找到我的time.py模块,然后再遇到标准time模块。

有没有办法解决?这是不可以的情况,并且模块名称不能重复使用吗?

有关封装哲学的任何解决方案和意见在这里都将很有用。


问题答案:

重用标准函数/类/模块/软件包的名称从来都不是一个好主意。尽量避免它。但是,有适合您情况的干净解决方法。

您看到的行为是导入SWS.time而不是stdlib的行为time,这是由于import古代python版本(2.x)的语义所致。要解决此问题,请添加:

from __future__ import absolute_import

在文件的最顶部。这会将importpython3.x的语义更改为更有意义。在这种情况下,语句:

import time

将仅引用顶级模块。因此,解释器在执行包内的导入时将 考虑您的SWS.time模块,而只会使用标准库之一。

如果一个模块 内的 软件包需要输入SWS.time你的选择:

  • 使用 显式 相对导入:

    from . import time
    
  • 使用绝对导入:

    import SWS.time as time
    

因此,您foo.py将像:

from __future__ import absolute_import

import time

from . import time as SWS_time


 类似资料:
  • 问题内容: 著名的Angular App Structure最佳实践推荐 博客文章概述了新推荐的angularjs项目结构,该项目结构现在是面向组件而非功能的,或者在最初的github问题中命名为“ Organized by Feature”。 博客文章建议每个模块中的每个文件应以模块名称开头,例如: 问题是:与在功能上命名文件相反,在模块的每个文件名内重复模块名称有什么好处和坏处?例如: 我问的

  • 我有一个原型项目,它的外观如下所示(有两个模块,和): 并且,当我使用工件id为“infra”的原型生成一个项目时,它应该生成如下结构: 不起作用的是,在父pom.xml中,我包含了以下模块: 这些模块条目不会被重命名为类似于(在生成时): 这就是我想要的。 知道怎么做吗,谢谢。 更新我在这里按要求添加元数据xml文件,但我不想修改archetype-metadata.xml文件。因为我想使用cr

  • 问题内容: 有没有一种简单的方法可以列出软件包中所有模块的名称,而无需使用? 例如,给定此程序包: 我想知道是否有标准或内置的方式来做这样的事情: 手动方法是遍历模块搜索路径,以找到包的目录。然后可以列出该目录中的所有文件,过滤出唯一命名为py / pyc / pyo的文件,剥离扩展名,然后返回该列表。但这对于模块导入机制已经在内部完成的工作来说似乎是相当多的工作。该功能在任何地方都可以使用吗?

  • 我想在我的应用程序中使用Java 9。我的一个依赖项有一个jar名称: 不幸的是,当我尝试将其更改为自动模块时,模块的名称无效。 我在命名模块时遗漏了什么吗?我的其他选择是什么?

  • 问题内容: 我正在尝试在一个项目中使用KárolyLőrentey的B树。但是,我遇到了一个问题,即我不能声明不合格,因为该名称在Foundation的(如在Swift 3中导入的)和的之间发生冲突。 要解决此冲突,通常可以使用该名称,然后使用即可。但是,该模块还包含一个名为的类。如果我写的话,Swift认为我指的是嵌套在该类型中的名为type的类型。 如果不这样做,我将根本无法使用该名称。 如何

  • 问题内容: 我在用Maven或Eclipse编译一些Scala时遇到问题,我尝试从Java jar导入一个包含名称空间和同名类的类。 我可以用编译。 例如,Java项目(jar)包含: 编译器抱怨: 在Scala 2.9.0.1(和)中使用Maven 3.0.03 / Eclipse 3.7.1 。 我遇到问题的jar是-它肯定包含几个实例,其中存在同名的名称空间和对象。 我正在尝试在Scala中