现有类不在目录中

我的意思是理解sympy的继承树(的一部分)。 为此,我做到了

1 b = sym.Symbol('b')
2 print(type(b))
3 print(dir(sympy.core))
4 print(dir(sympy.core.symbol))

<class 'sympy.core.symbol.Symbol'>
['BasicMeta','Registry','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__spec__','all_classes','division','ordering_of_classes','print_function']
...
AttributeError: module 'sympy.core.core' has no attribute 'symbol'

从第2行的结果来看,我希望symbol会出现在第3行打印的列表中。 然后我希望Symbol会出现在第4行打印出来的列表中。

但是第一次没有发生,引发了一个错误。第4行甚至没有执行。

为什么? 如何处理这种情况下的故障预防? 我应该如何检查有关Symbol的继承树?

xiaobiw9527 回答:现有类不在目录中

在整个sympy代码库中,导入样式混杂在一起。实际上,自上一发行版以来,此设置已被更改,因此在sympy master上运行示例可以得到:

<class 'sympy.core.symbol.Symbol'>
['Add','AlgebraicNumber','Atom','AtomicExpr','Basic','Catalan','Derivative','Dict','Dummy','E','Eq','Equality','EulerGamma','Expr','Float','Function','FunctionClass','Ge','GoldenRatio','GreaterThan','Gt','I','Integer','Lambda','Le','LessThan','Lt','Mod','Mul','N','Ne','Number','NumberSymbol','PoleError','Pow','PrecisionExhausted','Rational','RealNumber','Rel','S','StrictGreaterThan','StrictLessThan','Subs','Symbol','SympifyError','TribonacciConstant','Tuple','Unequality','UnevaluatedExpr','Wild','WildFunction','__all__','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__path__','__spec__','add','alphabets','arity','assumptions','basic','cache','cacheit','comp','compatibility','containers','core','coreerrors','count_ops','decorators','diff','evalf','evaluate','expand','expand_complex','expand_func','expand_log','expand_mul','expand_multinomial','expand_power_base','expand_power_exp','expand_trig','expr','exprtools','factor_nc','factor_terms','facts','function','gcd_terms','igcd','ilcm','integer_log','integer_nthroot','logic','mod','mod_inverse','mul','multidimensional','nan','nfloat','numbers','oo','operations','parameters','pi','power','preorder_traversal','prod','relational','rules','seterr','singleton','symbol','symbols','sympify','var','vectorize','zoo']
['AtomicExpr','Boolean','StdFactKB','_assume_defined','_filter_assumptions','_range','_re','_symbol','_uniquely_named_symbol','cartes','disambiguate','division','fuzzy_bool','is_sequence','ordered','print_function','random','sift','string','var']

造成混淆的原因是(在sympy 1.5.1中):

  1. sympy/__init__.pyfrom sympy.core import *
  2. sympy/core/__init__.py未定义__all__
  3. 核心程序包有一个名为coresympy.core.core)的子模块。

因此,当您在1.5.1中执行sympy.core时,您实际上是从sympy.core.core获得sympy/core/core.py模块的,而在master上它正确地给出了sympy.core软件包。

获取模块的更直接方法是

>>> import sympy as sym
>>> b = sym.Symbol('b')
>>> b.__module__
'sympy.core.symbol'
>>> import sys
>>> sys.modules[b.__module__]
<module 'sympy.core.symbol' from 'sympy/core/symbol.py'>```

如果我想看看里面有什么,我只会打开sympy/core/symbol.py

对于探索继承树,您可能会发现mro有用:

>>> type(b).mro()
[<class 'sympy.core.symbol.Symbol'>,<class 'sympy.core.expr.AtomicExpr'>,<class 'sympy.core.basic.Atom'>,<class 'sympy.core.expr.Expr'>,<class 'sympy.logic.boolalg.Boolean'>,<class 'sympy.core.basic.Basic'>,<class 'sympy.core.evalf.EvalfMixin'>,<class 'object'>]
本文链接:https://www.f2er.com/2710196.html

大家都在问