三行代码  ›  专栏  ›  技术社区  ›  richard gostanian

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

  •  0
  • richard gostanian  · 技术社区  · 2 月前

    我对corepython了解不少,但类的部分对我来说有些神秘。

    例如,我很难理解

    症状综合症状

    症状的文件包括可评估为

       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) 从症状

    然后isprime(31)也将工作。因此,原始测试部分是多余的。

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

    我本以为只要(1)就行了。

    为了进一步混淆,请考虑is_square

    根据文件,

    症状综合症状

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

    从sympy.ntheory.primetest导入is_square

    而如果我这样做

     from sympy.ntheory import is_square 
     
    

    我出错了

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

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

    在is_square的情况下,我需要在import语句中包含primetest以避免出错,而对于isprime,如果我包含或省略了primetest,则没有什么区别。为什么会有区别?

    1 回复  |  直到 2 月前
        1
  •  3
  •   Brian61354270    2 月前

    这通常被称为“重新导出”名称。从本质上讲 sympy 选择去掉一定级别的模块名称空间,使导入常用函数更加方便。

    sympy.ntheory __init__.py 包括导入

    from .primetest import isprime, is_gaussian_prime
    

    以及 __all__ export

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

    这将公开函数 isprime 从…起 sympy.ntheory.primetest 作为 症状 ,并允许 isprime 与glob一起导入 from sympy.ntheory import * 。正如您所指出的 ntheory 子模块以这种方式重新导出。未重新导出的名称(如 is_square )必须通过其定义的子模块访问。