Python: невозможно выбрать ошибки объектов модуля - PullRequest
9 голосов
/ 07 мая 2010

Я пытаюсь выбрать большой класс и получаю «Ошибка типа: невозможно выбрать объекты модуля».несмотря на то, что я смотрю в Интернете, я не могу точно понять, что это значит.и я не уверен, какой "объект модуля" вызывает проблемы.Есть ли способ найти виновника?трассировка стека, кажется, ничего не указывает.

Ответы [ 2 ]

8 голосов
/ 07 мая 2010

Я могу воспроизвести сообщение об ошибке следующим образом:

import cPickle

class Foo(object):
    def __init__(self):
        self.mod=cPickle

foo=Foo()
with file('/tmp/test.out', 'w') as f:
    cPickle.dump(foo, f) 

# TypeError: can't pickle module objects

У вас есть атрибут класса, который ссылается на модуль?

7 голосов
/ 22 марта 2014

Неспособность Python выделять объекты модуля является реальной проблемой.Есть ли веская причина?Я так не думаю.Отсутствие возможности выбора объектов модуля способствует слабости Python как параллельного / асинхронного языка.Если вы хотите выбрать объекты модуля или почти все в Python, используйте dill.

Python 3.2.5 (default, May 19 2013, 14:25:55) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> import os
>>> dill.dumps(os)
b'\x80\x03cdill.dill\n_import_module\nq\x00X\x02\x00\x00\x00osq\x01\x85q\x02Rq\x03.'
>>>
>>>
>>> # and for parlor tricks...
>>> class Foo(object):
...   x = 100
...   def __call__(self, f):
...     def bar(y):
...       return f(self.x) + y
...     return bar
... 
>>> @Foo()
... def do_thing(x):
...   return x
... 
>>> do_thing(3)
103 
>>> dill.loads(dill.dumps(do_thing))(3)
103
>>> 

Get dill здесь: https://github.com/uqfoundation/dill

...