Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';我不能把这个东西腌了吗?_Python - Fatal编程技术网

Python 为什么可以';我不能把这个东西腌了吗?

Python 为什么可以';我不能把这个东西腌了吗?,python,Python,我有一门课(如下): 当我运行以下测试时: def test_that_instrumentchangetransport_is_picklable(self): test_dict = {'Updated': 'PAllum', 'Description': 'BR/EUR/BRAZIL/11%/26/06/2017/BD', 'Ask Q': 500, 'Bbg': 'On', 'C Bid': 72.0, 'Benchmark': 'NL/USD/KKB/7

我有一门课(如下):

当我运行以下测试时:

def test_that_instrumentchangetransport_is_picklable(self):
        test_dict = {'Updated': 'PAllum', 'Description': 'BR/EUR/BRAZIL/11%/26/06/2017/BD',
        'Ask Q': 500, 'Bbg': 'On', 'C Bid': 72.0, 'Benchmark': 'NL/USD/KKB/7.000%/03/11/2009/BD',
        'ISIN': 'XS0077157575', 'Bid YTM': 0.0, 'Bid Q': 100, 'C Ask': 72.25, 'Ask YTM': 0.0, 'Bid ASW': 0.0,
        'Position': 1280000, 'What Changed': 'C Bid', 'Ask ASW': 0.0}
        ins_change = InstrumentChangeTransport(**test_dict)
        assert isinstance(ins_change, InstrumentChangeTransport)

        # Create a mock filesystem object
        file = open('testpickle.dat', 'w')
        file = Mock()
        pickle.dump(ins_change, file)
我得到:

Traceback (most recent call last):
  File "c:\python23\lib\site-packages\nose-0.11.0-py2.3.egg\nose\case.py", line 183, in runTest
    self.test(*self.arg)
  File "C:\Code\branches\demo\tests\test_framework.py", line 142, in test_that_instrumentchangetransport_is_picklable
    pickle.dump(ins_change, file)
  File "C:\Python23\Lib\copy_reg.py", line 83, in _reduce_ex
    dict = getstate()
TypeError: 'NoneType' object is not callable
我看了泡菜文件,但我不太明白

有什么想法吗


您正在此处丢失对已打开文件的引用。这可能是个问题吗?

它失败了,因为它找不到对象的
\uuu getstate\uuu()
。Pickle需要这些来确定如何Pickle/unpickle对象。您只需要
\uu getstate\uu()
\uu setstate\uu()
方法

请参见文档中的文本阅读器示例:

更新:我刚刚查看了,我认为您也没有正确使用它。
您正在模拟一个文件对象,但是当pickle尝试从中读取时,它不会得到任何返回,这就是为什么
getattr()
不会返回任何对象。

您的代码有几个小的“副作用”问题:在测试中使用的类名中突然出现“传输”(您定义的不是类名),将内置标识符
文件
作为局部变量进行可疑的践踏(不要这样做——在这里没有坏处,但践踏内置标识符的习惯总有一天会导致神秘的bug),已经注意到的对
Mock
的误用,最慢的默认使用,grungiest pickle文件的pickle协议和文本,而不是二进制文件

然而,正如@coonj所说,核心是缺乏国家控制。“普通”类不需要它(因为
self.\uuu dict\uuu
在缺少状态控制且没有其他特性的类中默认会被pickle和unpickle)——但由于您正在重写
\uuu getattr\uuu
,所以这不适用于您的类。您只需要另外两种非常简单的方法:

def __getstate__(self): return self.__dict__
def __setstate__(self, d): self.__dict__.update(d)

它基本上告诉
pickle
像对待普通类一样对待你的类,把
self.\uuu dict\uuuuuuuuuuuuuuuu
当作代表整个实例状态,尽管存在
\uuuuuu getattr\uuuuuuuuuuuu

作为旁注:“输入self.kwargs.iterkeys()”生成一个键列表并搜索它们。最好使用“key-in-self.kwargs”,它会尝试进行哈希表查找(更快)。在请求调试帮助时,它会帮助提供足够的代码来重现问题。从你发布的代码中删除所有不相关的内容会有更大的帮助。这似乎是问题的可能原因。感谢你验证这一点-100多个视图,你是第一个同意我的。。。我正在worried@coonj,我想人们很难理解为什么需要定义状态处理方法,因为通常情况下它们是不需要的(而且没有明确的文档说明,
\uuu getattr\uuuu
使它们成为必要的)。谢谢Alex&coonj,这个测试是为了重现我在twisted pb会话上发送远程对象时遇到的问题。这都有点笨手笨脚,不过我真的很欣赏你的观点。我的python学习刚刚完成了几次点击。再次感谢你的帮助。本
    file = open('testpickle.dat', 'w')
    file = Mock()
def __getstate__(self): return self.__dict__
def __setstate__(self, d): self.__dict__.update(d)