首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中:导入恶作剧(在文件夹中导入subfolder.module,在子文件夹/module2.py中使用)

在Python中:导入恶作剧(在文件夹中导入subfolder.module,在子文件夹/module2.py中使用)
EN

Stack Overflow用户
提问于 2016-08-19 10:44:57
回答 1查看 51关注 0票数 0

好吧,这一点也不太清楚。请允许我换个说法。

快速笔记:写这个问题时“解决了”。将接受应答,并输入关于最佳实践__的输入

原始快速笔记:这可能是一个复制。我显然不能很好地表达这个问题,以适应这种情况。如果是的话我很抱歉。

首先,为了使您处于有利位置,下面是我的项目的层次结构以及一些相关代码:

代码语言:javascript
复制
Project/
├── main.py
└── lib
    ├── __init__.py
    ├── A.py
    ├── B.py
    └── C.py

main.py

代码语言:javascript
复制
## Imports
from lib.A  import ClassA   as clA
from lib.B  import ClassB   as clB
from lib.C  import ClassC   as clC

#
# ... Some other code ...
#

a = clA()
b = clB()

a.add_ClB_Inst_Ref(b)

A.py

代码语言:javascript
复制
## Imports
if __name__ == "__main__":
    from B  import ClassB   as clB
    from C  import ClassC   as clC

class ClassA:

    dict_Of_Weighted_ClB_Refs = {}
    #
    # ... Some other code (attributes, init, ...) ...
    #
    
    def add_ClB_Inst_Ref(self, ClB_Instance):
    
        if isinstance(ClB_Instance, clB):
            key = clB.ID

            if key in self.dict_Of_Weighted_ClB_Refs:
                self.dict_Of_Weighted_ClB_Refs[key] +=1
            else:
                self.dict_Of_Weighted_ClB_Refs[key] = 1

问题:

当检查方法的参数是ClassB对象的实例时,程序在ClassB方法中崩溃,错误如下:

代码语言:javascript
复制
NameError: name 'clB' is not defined

“好吧”,你可能会说,“当然,它崩溃了,A.py文件从来没有听说过那个花哨的clB__!”而且,是的,这可能是问题所在,但是当我试图在这个文件中导入它时,将imports部分替换为:

代码语言:javascript
复制
## Imports
from B  import ClassB   as clB
from C  import ClassC   as clC

我得到以下错误:ImportError: No module named 'B'

问题:

我怎么才能解决这个问题?欢迎你对最佳做法的投入。

怀疑:

所有这些都让我想到了这样的假设:

  • 在程序执行期间,在项目根处导入的文件中导入的模块并不是全局可用的。
  • import从执行初始脚本的位置搜索匹配。(Note:这会导致我再次检查我是否尝试过这样做,from lib.B import ClassB as clB就像在主文件中一样;事实证明,我没有这样做,这很有效.我明白逻辑,但这似乎是违反直觉的。详见下面的答案。
  • 我的项目架构有缺陷。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 10:44:57

正如问题中所指出的,下面是修复模块A中不可用模块B的问题所需要的。

只需将A.py中的imports部分替换为:

代码语言:javascript
复制
## Imports
if __name__ == "__main__":
    from B  import ClassB   as clB
    from C  import ClassC   as clC
else:
    from lib.B  import ClassB   as clB
    from lib.C  import ClassC   as clC

对我来说,这似乎不是最好的解决方案,因为这意味着每次从lib文件夹以外的地方调用模块时,它都假设这个“某处”是项目的根文件夹,这可能会导致一些严重的冲突。

如果你能在这个问题上提供一个更一般的方法和/或最佳实践,请写你自己的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39037069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档