猴子修补datetime.datetime时Python“atexit._run_exitfuncs中的错误”

时间:2013-12-06 04:45:24

标签: python datetime runtime-error monkeypatching

我有一个工作正常的程序,然后我添加了此代码用于测试目的:

class datetimeMock(datetime.datetime): 
    def utcnow():
        return datetime.datetime (2013, 12, 17, 12)

if __name__=="__main__":

    #testing:
    datetime.datetime = datetimeMock        

    # start processing ...

现在该程序似乎工作正常,但我在退出时遇到此错误:

Error in atexit._run_exitfuncs:                                                              
Traceback (most recent call last):                                                           
  File "C:\Python33\lib\site-packages\IPython\core\history.py", line 508, in end_session     
    len(self.input_hist_parsed)-1, self.session_number))                                     
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.               

任何人都可以理解这个错误吗?

1 个答案:

答案 0 :(得分:1)

替换内置类型会产生麻烦;-)尝试在程序退出之前将datetime.datetime恢复为原始值。程序关闭时会运行atexit(请参阅文档 - 它是标准的Python模块)。据推测,IPython sqlite3在程序结束时使用datetime.datetime来存储一些历史记录,而您的虚假orig_datetime = datetime.datetime # new datetime.datetime = datetimeMock # the same try: # start processing ... finally: datetime.datetime = orig_datetime 类令人困惑。

{{1}}

或者从vanilla shell运行程序,而不是通过IPython运行。