现有类不在目录中

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

我打算理解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的继承树?

python inheritance sympy symbolic-math
1个回答
1
投票

在整个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', 'Basic', 'Boolean', 'Dummy', 'Expr', 'FunctionClass', 'S', 'StdFactKB', 'Symbol', 'Tuple', 'Wild', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_assume_defined', '_filter_assumptions', '_range', '_re', '_symbol', '_uniquely_named_symbol', 'cacheit', 'cartes', 'disambiguate', 'division', 'fuzzy_bool', 'is_sequence', 'ordered', 'print_function', 'random', 'sift', 'string', 'symbols', 'sympify', '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模块,而在母版上它正确地给出了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'>]
© www.soinside.com 2019 - 2024. All rights reserved.