can't pickle instancemethod objects

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jim Lewis

    #1

    can't pickle instancemethod objects

    Pickling an instance of a class, gives "can't pickle instancemethod
    objects". What does this mean? How do I find the class method creating
    the problem?

  • Steven D'Aprano

    #2
    Re: can't pickle instancemethod objects

    On Sun, 09 Jul 2006 05:45:27 -0700, Jim Lewis wrote:
    Pickling an instance of a class, gives "can't pickle instancemethod
    objects". What does this mean?
    It means you can't pickle instance methods.
    How do I find the class method creating the problem?
    How about you post the complete stack trace of the exception? Chances are
    it will contain much useful information.


    --
    Steven.

    Comment

    • Jim Lewis

      #3
      Re: can't pickle instancemethod objects

      How about you post the complete stack trace of the exception?

      Exception in Tkinter callback
      Traceback (most recent call last):
      File "C:\program files\python\li b\lib-tk\Tkinter.py", line 1345, in
      __call__
      return self.func(*args )
      File "C:\Public\worl d.py", line 1832, in BtnGo
      DoBtnGo()
      File "C:\Public\worl d.py", line 1812, in DoBtnGo
      if DoPickle: SavePickle ()
      File "C:\Public\worl d.py", line 1817, in SavePickle
      pickle.dump (pop,f)
      File "C:\program files\python\li b\pickle.py", line 1382, in dump
      Pickler(file, protocol, bin).dump(obj)
      File "C:\program files\python\li b\pickle.py", line 231, in dump
      self.save(obj)
      File "C:\program files\python\li b\pickle.py", line 293, in save
      f(self, obj) # Call unbound method with explicit self
      File "C:\program files\python\li b\pickle.py", line 739, in save_inst
      save(stuff)
      File "C:\program files\python\li b\pickle.py", line 293, in save
      f(self, obj) # Call unbound method with explicit self
      File "C:\program files\python\li b\pickle.py", line 663, in save_dict
      self._batch_set items(obj.iteri tems())
      File "C:\program files\python\li b\pickle.py", line 677, in
      _batch_setitems
      save(v)
      File "C:\program files\python\li b\pickle.py", line 293, in save
      f(self, obj) # Call unbound method with explicit self
      File "C:\program files\python\li b\pickle.py", line 614, in save_list
      self._batch_app ends(iter(obj))
      File "C:\program files\python\li b\pickle.py", line 629, in
      _batch_appends
      save(x)
      File "C:\program files\python\li b\pickle.py", line 293, in save
      f(self, obj) # Call unbound method with explicit self
      File "C:\program files\python\li b\pickle.py", line 739, in save_inst
      save(stuff)
      File "C:\program files\python\li b\pickle.py", line 293, in save
      f(self, obj) # Call unbound method with explicit self
      File "C:\program files\python\li b\pickle.py", line 663, in save_dict
      self._batch_set items(obj.iteri tems())
      File "C:\program files\python\li b\pickle.py", line 677, in
      _batch_setitems
      save(v)
      File "C:\program files\python\li b\pickle.py", line 313, in save
      rv = reduce(self.pro to)
      File "C:\program files\python\li b\copy_reg.py", line 69, in
      _reduce_ex
      raise TypeError, "can't pickle %s objects" % base.__name__
      TypeError: can't pickle instancemethod objects

      Comment

      • Steven D'Aprano

        #4
        Re: can't pickle instancemethod objects

        On Sun, 09 Jul 2006 07:06:25 -0700, Jim Lewis wrote:
        >How about you post the complete stack trace of the exception?
        >
        Exception in Tkinter callback
        Traceback (most recent call last):
        File "C:\program files\python\li b\lib-tk\Tkinter.py", line 1345, in
        __call__
        return self.func(*args )
        File "C:\Public\worl d.py", line 1832, in BtnGo
        DoBtnGo()
        File "C:\Public\worl d.py", line 1812, in DoBtnGo
        if DoPickle: SavePickle ()
        File "C:\Public\worl d.py", line 1817, in SavePickle
        pickle.dump (pop,f)
        I'd suggest that "pop" could be your culprit. At least, that's where I'd
        start looking. What is pop? A function or an instance method?

        I can't reproduce your error exactly -- the closest I get is "TypeError:
        can't pickle function objects" when I try to pickle a method. Possibly
        that's just a change in error message, which is not guaranteed to be
        constant across Python versions.

        --
        Steven.

        Comment

        • Jim Lewis

          #5
          Re: can't pickle instancemethod objects

          I'd suggest that "pop" could be your culprit. ...What is pop? A function or an instance method?

          Neither. pop is an instance of a class, like:
          class X:
          ...
          pop = X ()

          pop surely is the culprit but it has arrays of objects, etc., and I
          don't know what to look for.

          Comment

          • Steven D'Aprano

            #6
            Re: can't pickle instancemethod objects

            On Sun, 09 Jul 2006 08:39:29 -0700, Jim Lewis wrote:
            >I'd suggest that "pop" could be your culprit. ...What is pop? A function or an instance method?
            >
            Neither. pop is an instance of a class, like:
            class X:
            ...
            pop = X ()
            >
            pop surely is the culprit but it has arrays of objects, etc., and I
            don't know what to look for.
            I'd start by looking for an attribute of pop that holds a reference to
            some function or method. E.g. something like this:

            class X():
            def method(self):
            pass
            def __init__(self):
            self.L = [1, "a", X.method] # note the lack of ()s

            pop = X()

            Otherwise, I'm working blind without knowing more about your class.

            Here's a thought: comment out every attribute in your class, and then try
            pickling it. If it succeeds, uncomment just *one* attribute, and try
            pickling again. Repeat until pickling fails.


            --
            Steven.

            Comment

            • Jim Lewis

              #7
              Re: can't pickle instancemethod objects

              Here's a thought: comment out every attribute in your class, and then try
              pickling it. If it succeeds, uncomment just *one* attribute, and try
              pickling again. Repeat until pickling fails.
              Was trying to avoid that but you motivated me to do so and now I found
              the probem.

              In a utility routine I had:
              obj.act = act
              ActionSucceded = obj.act()

              Had to add:
              obj.act = None

              Thanks :-)

              Comment

              Working...