无法在Jython中导入某些Math模块

时间:2014-07-26 15:38:14

标签: jython

我正在尝试从数学库中导入一些模块,但只会导入一些模块。例如isnanasinh不会导入,piacos会导入。基于jython documentation,这些模块应该可以导入。

有没有人有解决方案为什么只有一些模块正在导入?

enter image description here

1 个答案:

答案 0 :(得分:2)

我担心我有一些坏消息;但我可能有一个可能的解决办法。

坏消息

我最近使用Jython完成了一个相当大的项目,并从该经验得出结论,Jython文档中存在错误。其中大部分内容似乎或多或少都直接从Python文档中复制过,不幸的是实现之间存在一些不一致。

如果你首先启动Python解释器,导入数学,然后在模块上做一个目录,你会发现isnan

Python 2.7.5 (default, Jun 17 2014, 18:11:42) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> dir(math)
['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 
'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 
'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 
'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 
'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
>>> print math.isnan.__doc__
isnan(x) -> bool

Check if float x is not a number (NaN).

另一方面,如果你在Jython中做同样的事情,你会发现数学模块没有isnan函数。

当我安装Jython时,我也安装了源代码。所以,只是为了确定,我通过源代码找到了以下内容:

[mdiana@tc-xdevmd modules]$ pwd
/opt/jython/jython-2.5.3/src/org/python/modules
[mdiana@tc-xdevmd modules]$ grep -Ri "isnan" *
math.java:        if (Double.isNaN(v))
math.java:        if (Double.isNaN(x) || Double.isInfinite(x) || x == 0.0) {
struct.java:                    Float.isInfinite(v) || Float.isNaN(v))) {
struct.java:                    (Double.isInfinite(v) || Double.isNaN(v))) {
struct.java:                    Float.isInfinite(v) || Float.isNaN(v))) {
struct.java:                    (Double.isInfinite(v) || Double.isNaN(v))) {

这进一步证明代码中没有任何isnan(无论文档说什么)。 Jython本身正在使用Java库来实现该功能。

建议的解决方法

所以,你不会发疯,你的装置没有任何问题。使用Jython,您将不时遇到这样的问题。抱歉。我建议使用Java库java.lang.Floatjava.lang.Double。这两个都有静态方法isNaN

[mdiana@tc-xdevmd ~]$ jython
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:48:36) 
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_31
Type "help", "copyright", "credits" or "license" for more information.
>>> import java.lang.Float as JFloat
>>> JFloat.isNaN(4.001)
False

总而言之,我喜欢Jython;但有时像上面这样的事情是我们能做的最好的事情。希望有所帮助。