1

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

第一个是预期的行为,因为_aux/__init__.pycontains 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- 所以在_foobar.py函数被导入。

但是在_abbrev_testing.py模块被导入: 在此处输入图像描述

有人了解这两个文件之间的区别吗?我应该以不同的方式做到这一点吗?

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

编辑:在这两个文件中它都有效,当我使用不依赖的长导入语句时_aux/__init__.py

  • 短:(from mypackage._aux import is_error格式from _aux import function

  • 长:(from mypackage._aux.is_error._is_error import is_error
    格式from _aux.folder.file import function

这个问题可以概括为:
什么在_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
4

1 回答 1

0

_abbrev_testing.py 中的什么破坏了init .py?

Gotcha - 如果你改变:

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

仅在导入 .abbrev_testing._abbrev_testing 后才将 is_error 设置为函数“is_error” - 其中 is_error (正确)已作为模块导入。

我应该以不同的方式做到这一点吗?

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

于 2020-05-10T20:00:49.980 回答