有人可以解释为什么从 smypy 访问方法缺乏对称性吗

问题描述 投票:0回答:1

我对核心Python了解很多,但类部分对我来说有点神秘。

例如我很难理解

sympy.ntheory.primetest

sympy 的文档包括可评估为的素性测试

   sympy.ntheory.primetest.isprime(n)

https://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.primetest.isprime

所以如果我想引用 isprime 而不需要所有前面的东西,我可以这样做

(1) 从 sympy.ntheory.primetest 导入 isprime

然后 isprime(31) 例如,将返回 True。

不过我也可以

(2) 从 sympy.ntheory 导入 isprime

然后 isprime(31) 也可以工作。所以primetest部分是多余的。

所以问题是为什么(1)和(2)都有效?

我本以为只有 (1) 就可以。

为了增加更多混乱,请考虑 is_square

根据文档,我们有,

sympy.ntheory.primetest.is_square

但是为了单独使用 is_square ,我必须这样做

从 sympy.ntheory.primetest 导入 is_square

而如果我这样做

 from sympy.ntheory import is_square 
 

我收到错误

导入错误:无法从“sympy.ntheory”导入名称“is_square”

因此,其中一些方法似乎缺乏对称性。

在 is_square 情况下,我需要在导入语句中包含 primetest 以避免出现错误,而对于 isprime 来说,包含 primetest 或省略它都没有区别。为什么有区别?

python python-import sympy
1个回答
1
投票

这通常被称为“重新导出”名称。本质上,

sympy
的作者选择去掉一定程度的模块命名空间,以使导入常用函数更加方便。

sympy.ntheory
__init__.py
包括导入

from .primetest import isprime, is_gaussian_prime

以及

__all__
出口

__all__ = [
    # ...
    'isprime', 'is_gaussian_prime',
    # ...
]

这会将

isprime
中的函数
sympy.ntheory.primetest
公开为
sympy.ntheory
的成员。

© www.soinside.com 2019 - 2024. All rights reserved.