在Python中,为什么完全相同的代码行第一次失败并第二次成功?

时间:2014-11-17 23:21:27

标签: python

这是我的代码完全一样(我正在研究数值分析作业问题):

import integration as I
from math import *
import numpy as np

problem = 4

<snip/>

elif problem == 4:

    h = 0.001
    X = np.linspace(0,1, 1//h+2)

    def f(x):
        if x==0 or x==1:
            return 0
        try:
            return x**3/( (1-x)**5 * (e**(x/(1-x))-1) )
        except OverflowError:
            return 0

    try:
        Y = list(map(f,X))
    except:
        print("That failed.")
        Y = list(map(f,X))

    print("Integral: %s"%I.Simpsons_L(Y, h))

这是shell的输出:

>>> 
That failed.
Integral: 6.49393940227
>>> 

如果我没有except子句,那么这就是我得到的错误:

Traceback (most recent call last):
  File "<snip/>", line 150, in <module>
    Y = list(map(f,X))
  File "<snip/>", line 145, in f
    return x**3/( (1-x)**5 * (e**(x/(1-x))-1) )
  File "C:\Python33\lib\idlelib\PyShell.py", line 60, in idle_showwarning
    file.write(warnings.formatwarning(message, category, filename,
AttributeError: 'NoneType' object has no attribute 'write'

修改1

如果我从命令行运行我的程序,这就是我得到的:

NA_homework3problems.py:145: RuntimeWarning: overflow encountered in double_scalars
  return x**3/( (1-x)**5 * (e**(x/(1-x))-1) )

显然,我的问题有一个解决方法,所以这不是我问这个问题的原因。我问为什么首先出现问题。我实际上两次执行相同的功能,它第二次工作,但不是第一次。此外,如果我自己只有map,并且如果我尝试在同一个地图上使用list两次,那么第二个是空的,我认为这是设计的。那么,这里发生了什么?

2 个答案:

答案 0 :(得分:3)

您之前完成的操作已将file

替换为pyshell中的None引用

在您第一次浏览地图时,正在生成例外 Warning

例如

RuntimeWarning: overflow encountered in double_scalars

您看到的异常是由于尝试打印此警告失败。

警告正常工作方式是,一旦您收到警报,警告将在会话的剩余时间内被静音

第二次运行也会触发溢出,但由于警告被禁止,因此不会尝试打印错误,因此也不会遇到pyshell错误

你应该查看你的代码,弄清楚你在做什么,并在pyshell中吹走file变量

答案 1 :(得分:0)

我做了更多的狩猎并确定导致问题的原因。不知何故,这不是我的代码,而是numpy的。以下代码行足以在第一次但不是第二次抛出错误。

>>> import numpy
>>> 1/numpy.float64(0)
Traceback (most recent call last):
  File "<pyshell#84>", line 1, in <module>
    1/numpy.float64(0)
  File "C:\Python33\lib\idlelib\PyShell.py", line 64, in idle_showwarning
    file.write(warnings.formatwarning(message, category, filename,
AttributeError: 'NoneType' object has no attribute 'write'
>>> 1/numpy.float64(0)
inf

不知何故,sys.__stderr__设置为None。我已针对此问题提交了错误报告:#5289。希望它很快就能解决。