为什么一个文件中的相同代码导入一个函数,而在另一个文件中导入同名模块?
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/foobar/_foobar.py
it imports the function is_error
from _aux/is_error/_is_error.py
.
而是_aux/abbrev_testing/_abbrev_testing.py
it imports the whole module _aux/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
:
的长导入语句时
短: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
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 的导入系统很复杂,但复杂性是应有的,因为它是一个复杂的问题。正确的命名使这种复杂性变得易于管理。
同一个导入语句from mypackage._aux import is_error
在类似文件中有两种不同的含义:
在
_aux/foobar/_foobar.py
it imports the functionis_error
from_aux/is_error/_is_error.py
.而是
_aux/abbrev_testing/_abbrev_testing.py
it imports the whole module_aux/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
:
短:
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
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 的导入系统很复杂,但复杂性是应有的,因为它是一个复杂的问题。正确的命名使这种复杂性变得易于管理。