为什么一个文件中的相同代码导入一个函数,而在另一个文件中导入同名模块?

Why does the same code in one file import a function, and in a different file the module of the same name?

同一个导入语句from mypackage._aux import is_error在类似文件中有两种不同的含义:

第一个是预期的行为,因为 _aux/__init__.py 包含 from .is_error._is_error import is_error。 (格式from .folder.file import function)

当我运行pytest时,_abbrev_testing_test.py中的两个测试都失败了,因为is_error不是预期的功能。 (TypeError: 'module' object is not callable)

当我使用我想用新函数缩写的行时它起作用了: 这包括 _foobar_test.py - so in _foobar.py 中的测试 函数 被导入。

但在 _abbrev_testing.py 中导入了 模块

有人了解这两个文件的区别吗?我是否应该以不同的方式完成此操作?

我很想知道是否有一些逻辑规则可以避免这种情况。 (对我来说,这看起来既荒谬又古怪。)

编辑: 在两个文件中它都有效,当我使用不依赖于 _aux/__init__.py:

的长导入语句时

这个问题可以概括为:
_abbrev_testing.py中的什么东西在破坏__init__.py

编辑 2: 重现步骤:

me@ubuntu:~$ git clone https://github.com/watchduck/module_object_is_not_callable.git
me@ubuntu:~$ cd module_object_is_not_callable/
me@ubuntu:~/module_object_is_not_callable$ virtualenv -p python3 env

使用 IDE 打开项目。

(env) me@ubuntu:~/module_object_is_not_callable$ pip install pytest
(env) me@ubuntu:~/module_object_is_not_callable$ pytest

What in _abbrev_testing.py is sabotaging the init.py?

注意事项 - 如果您更改:

from .is_error._is_error import is_error
from .abbrev_testing._abbrev_testing import abbrev_testing
from .foobar._foobar import foobar

在你的初始化问题消失了。你是:

from .abbrev_testing._abbrev_testing import abbrev_testing
from .is_error._is_error import is_error

将 is_error 设置为 函数 "is_error" 仅 您导入后。abbrev_testing._abbrev_testing - is_error 已经(正确地)作为模块导入。

Should I have done this in a different way?

当然可以。不要将函数命名为与 modules/packages 相同的名称。它们是不同的东西,所以应该有不同的名称。另外 - 避免类似的重复名称和前导下划线。使代码很难阅读(所以我多次打开 _abbrev_testing_errors.py 因为它看起来与 _abbrev_testing.py 或 _abbrev_testing_test.py 非常相似)- 保留 "test" 用于测试。 我是认真地说的——python 的导入系统很复杂,但复杂性是应有的,因为它是一个复杂的问题。正确的命名使这种复杂性变得易于管理。